我在这里使用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();
}
答案 0 :(得分:6)
纯文本的大小无关紧要。只需确保在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个字节)。
希望有所帮助。
答案 1 :(得分:0)
你需要填充。实际上,您链接的页面有一个关于填充的示例(在C ++中)。
使用填充,您可以加密非标准块大小。
答案 2 :(得分:0)
不要将字符串转换为Unicode字节表示形式。检查正确的长度并且没有提供足够的随机化将是非常困难的。
您可以执行以下操作:使用key derivation function。您需要一个固定长度的字节数组来输入函数。这是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.
// ...
}
}
有关我如何使用此功能的示例,请查看my project using Rijndael。我有一个密码步骤,我接受一个字符串,并使用上述方法获取密钥和iv字节数组。