为我的AES方法创建一个字节数组的字符数是多少?

我在这里使用AES方法: http : //msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx

我想要一个字符串值,我将转换为字节数组并将其传递给AES加密方法。 字符串应该有多少个字符来生成方法所需的正确字节数组大小?

static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV) { // Check arguments. if (plainText == null || plainText.Length <= 0) throw new ArgumentNullException("plainText"); if (Key == null || Key.Length <= 0) throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0) throw new ArgumentNullException("Key"); // Declare the stream used to encrypt to an in memory // array of bytes. MemoryStream msEncrypt = null; // Declare the RijndaelManaged object // used to encrypt the data. RijndaelManaged aesAlg = null; try { // Create a RijndaelManaged object // with the specified key and IV. aesAlg = new RijndaelManaged(); aesAlg.Key = Key; aesAlg.IV = IV; // Create a decrytor to perform the stream transform. ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); // Create the streams used for encryption. msEncrypt = new MemoryStream(); using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { //Write all data to the stream. swEncrypt.Write(plainText); } } } finally { // Clear the RijndaelManaged object. if (aesAlg != null) aesAlg.Clear(); } // Return the encrypted bytes from the memory stream. return msEncrypt.ToArray(); } 

纯文本的大小无关紧要。 只需确保在decryptStringFromBytes_AES(byte [] cipherText,byte [] Key,byte [] IV)方法中使用完全相同的IV和Key以及加密字节。 这将返回给您输入的纯文本。

例如:

 string plain_text = "Cool this works"; byte[] iv = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; byte[] key = new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }; byte[] encrytped_text = encryptStringToBytes_AES(plain_text, key, iv); string plain_text_again = decryptStringFromBytes_AES(encrypted_text, key, iv); 

在这里你应该看到纯文本和纯文本再次相同。 现在继续将plain_text更改为您想要的任何内容,并看到它正常工作。

RijndaelManaged的默认值为:
BlockSize:128
KeySize:256
模式:CipherMode.CBC
填充:PaddingMode.PKCS7

有效的IV大小是:
128,192,256位(这是BlockSize,请确保将其设置为您正在使用的大小IV)
有效的密钥大小为:
128,192,256位(这是KeySize,请确保将其设置为您正在使用的大小键)

这意味着byte [] iv可以是16,24或32个字节(在我上面的例子中是16个字节),而byte []键也可以是16,24或32个字节(在我上面的例子中它是16个字节) )。

希望有所帮助。

你需要填充。 实际上,您链接的页面有一个关于填充的示例(在C ++中)。

使用填充,您可以加密非标准块大小。

不要将字符串转换为Unicode字节表示forms。 检查正确的长度并且没有提供足够的随机化将是非常困难的。

您可以执行以下操作:使用密钥派生函数 。 您需要一个固定长度的字节数组来输入函数。 这就是Rfc2898最擅长的 。

因此,创建一个新的Rfc2898对象:

 using PBKDF2 = System.Security.Cryptography.Rfc2898DeriveBytes; class Example { byte[] mySalt = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; void Initialize( string password ) { PBKDF2 kdf = new PBKDF2( password, mySalt ); // Then you have your algorithm // When you need a key: use: byte[] key = kdf.GetBytes( 16 ); // for a 128-bit key (16*8=128) // You can specify how many bytes you need. Same for IV. byte[] iv = kdf.GetBytes( 16 ); // 128 bits again. // And then call your constructor, etc. // ... } } 

有关我如何使用它的示例,请使用Rijndael查看我的项目 。 我有一个密码步骤,我接受一个字符串,并使用上述方法获取密钥和iv字节数组。