根据我的问题Aes Encryption ...错过了一个重要的部分,我现在已经了解到我在字符串上创建可逆加密的假设有点过时了.我现在有
public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey)
{
var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt);
using (var provider = new AesCryptoServiceProvider())
{
provider.Key = encryptionKey;
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV))
{
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(toEncryptBytes, 0, toEncryptBytes.Length);
cs.FlushFinalBlock();
}
return ms.ToArray();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这产生了一致的结果; 但是,如果不知道/设置初始化向量,我将无法解密.我真的不想将三个值传递给这个方法(在IV上),这让我硬编码IV或从密钥中导出它.我想知道这是不是一个好的做法,或者它是否会使加密的值容易受到某种程度的攻击......或者我是否真的过度思考这个并且应该硬编码IV?
更新 根据铱星的建议,我尝试了类似的东西:
public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey)
{
if …Run Code Online (Sandbox Code Playgroud) 这是我运行的例子.它具有相同的Mode,Padding,BlockSize,KeySize.我使用相同的init向量,密钥和数据.
使用RijndaelManaged产生加密值:0x8d,0x81,0x27,0xc6,0x3c,0xe2,0x53,0x2f,0x35,0x78,0x90,0xc2,0x2e,0x3b,0x8a,0x61,0x41,0x47,0xd6,0xd0,0xff ,0x92,0x72,0x3d,0xc6,0x16,0x2b,0xd8,0xb5,0xd9,0x12,0x85
使用AesCryptoServiceProvider生成加密值:0x8d,0x9f,0x6e,0x99,0xe9,0x54,0x8b,0x12,0xa9,0x88,0x1a,0x3d,0x65,0x23,0x9c,0x4e,0x18,0x5a,0x89,0x31,0xf5 ,0x75,0xc5,0x9e,0X0D,0x43,0xe9,0x86,0xd4,0xf3,0x64,0x3a
这是我用来生成这些结果的代码
public partial class AesTest
{
private SymmetricAlgorithm mEncryptionType;
private byte[] mPrivateKey;
private byte[] mInitializationVector;
private byte[] mData;
public AesTest()
{
mPrivateKey = new byte[32]
{
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22,
0x22, 0x22, 0x22, 0x22
};
mInitializationVector = new byte[16]
{
0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, …Run Code Online (Sandbox Code Playgroud) 我正在尝试加密和解密文本,有时,特别是对于较大的文本,随机字符出现在解密的文本中.我在System.Security.Cryptography命名空间内使用AES加密技术,我正在尝试加密的文本将是一个URL和一些信息,例如页面标题.我在下面提供了一个例子以及我尝试过的内容.我还编写了两种加密和解密方法,减去输出到调试窗口的任何行.使用的Key和IV应该不是问题,因为现在它们将是不变的.
我认为明智的做法是指出它18/01/2013;18/01/2013在预期的单独事件中加密和解密.
说我想解密这个文本:
Barnabe Googes Information & Homepage | Search and Research on BarnabeGooge.com;18/01/2013;18/01/2013;;http://www.googe.com
默认情况下,它使用UTF-8,它将加密为:
?????????????????????????????????????????????????????????????????
并解密回:
Barnabe Googes Information & Homepage | Search and Research on B???Ax2?!??f?M]18/01/20?;18/01[?;>??l?????m??*-??+??^A[=?
Padding.Zeros似乎是最好的.我也不能使用,Padding.None因为它抛出了NotSupportedException: bad data length.ModeCBC(不是它应该重要).WebUtility.HtmlDecode()解码标题,但它并没有影响它.您可以看到,下面的加密使用AES加密.我想指出,key并且IV这两个全局字符串与加密和解密方法在同一个类中.我这样做的原因是乱搞不同的编码,并且CryptographyServiceProviders,如果偶然的随机变化有效.请忽略它们,因为它们是不变的,不会影响最终的加密/解密.
public static byte[] EncryptStringToBytes(string plainText, Encoding Enc)
{
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText"); …Run Code Online (Sandbox Code Playgroud) 该AesCryptoServiceProvider.LegalKeySizes字段显示允许的位大小.
但是,我不明白的是,如果这些是真的,我怎么能成功利用2048位密钥长度(256字节)?
我想我的真正问题是,我的密钥是否产生了所请求的大小(大于最大32字节),但是在加密/解密过程中实际只采用了前32字节(256位),从而呈现更大的密钥大小浪费空间?
我不知道是否有一种方法可以实际告知API中暴露的内容......
有什么想法吗?也许我是以错误的方式看待这个?
我在C#/ .Net Framework中使用AESCryptoServiceProvider,我想知道IV和Keys有多大(以字节为单位).我很确定这个课程遵循AES的规格,所以如果有人有任何想法,我会很高兴听到它:)
身份提供程序使用component pro的功能加密Saml Assertion
Dim encryptedSamlAssertion As New EncryptedAssertion(samlAssertion, encryptingCert, New System.Security.Cryptography.Xml.EncryptionMethod(SamlKeyAlgorithm.Aes256Cbc))
Run Code Online (Sandbox Code Playgroud)
在服务提供商,我试图解密断言.但我不能使用组件专业版.我必须使用System.Security.Cryptography
请帮助我提供一些有关如何使用X509Certificate和Aes256Cbc算法实现SamlAssertions解密的更多信息
使用.NET加密敏感信息时 AesCryptoServiceProvider库我为每个加密的值生成一个唯一的初始化向量(IV)。在保存加密数据的数据库记录中,我有一个名为“ IV”的字段,该字段存储用于稍后解密的初始化向量。
可以将初始化矢量与密文一起存储吗?通过将IV附加到密文中也许呢?如果是这样,是否有标准方法?
encryption aes aescryptoserviceprovider initialization-vector
public static string GenerateKey()
{
AesCryptoServiceProvider aesCrypto = (AesCryptoServiceProvider)AesCryptoServiceProvider.Create();
// Use the Automatically generated key for Encryption.
return ASCIIEncoding.ASCII.GetString(aesCrypto.Key);
}
static void EncryptFile(string sInputFilename, string sOutputFilename, string sKey)
{
FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);
AesCryptoServiceProvider AES = new AesCryptoServiceProvider();
// Sets the appropriate block size for the AES Encryption Method
AES.BlockSize = 128;
AES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
AES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform aesencrypt = AES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted, aesencrypt, CryptoStreamMode.Write);
byte[] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 AES 进行加密/解密,然后我尝试了 CBC 和 ECB 模式,我从所有三个模式中都获得了相同的加密输出!这是怎么回事?
这可能没有错,但我只是不知道会发生什么。如果它们都产生相同的密码,那么拥有模式有什么意义?是时间复杂度还是性能复杂度?
你能解释一下 AES 和它的密码模式之间的区别吗?什么是默认密码模式?或者如果你能给我任何参考,因为 MSDN 不够清楚
谢谢你
c# encryption cryptography encryption-symmetric aescryptoserviceprovider