我有简单的对称加密/解密应用程序,可以正常工作:
namespace Crypto
{
class Program
{
public static void EncryptSomeText()
{
string original ="My secretdata!";
using (SymmetricAlgorithm symmetricAlgorithm =
new AesManaged())
{
byte[] encrypted = Encrypt(symmetricAlgorithm, original);
string roundtrip = Decrypt(symmetricAlgorithm, encrypted);
// Displays: My secret data!
Console.WriteLine("Original:{ 0}", original);
Console.WriteLine("RoundTrip:{ 0}", roundtrip);
}
}
static byte[] Encrypt(SymmetricAlgorithm aesAlg, string plainText)
{
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt =
new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
}
return msEncrypt.ToArray();
}
}
}
static string Decrypt(SymmetricAlgorithm aesAlg, byte[] cipherText)
{
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt =
new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
}
static void Main(string[] args)
{
SymmetricAlgorithm sma = SymmetricAlgorithm.Create();
byte[] b = Encrypt(sma,"bla bla");
string s= Decrypt(sma, b);
Console.WriteLine("Decrypted {0}", s);
}
}
}
我只想知道密钥创建。这是否意味着它是在对称算法创建过程中以自动方式创建的?它每次生成不同吗?我想,用户应该为此目的传递密钥。
SymmetricAlgorithm sma = SymmetricAlgorithm.Create();
答案 0 :(得分:1)
当您访问Key
的{{1}}属性时会生成随机密钥,前提是您未在此之前将SymmetricAlgorithm
设置为某个预定义密钥。在构建Key
时,它不会生成。
SymmetricAlgorithm
var sma = SymmetricAlgorithm.Create();
// no key generated here yet
var key = sma.Key; // generated key
// accessing `Key` causes random key generation
var sma = SymmetricAlgorithm.Create();
// no key here
sma.Key = myKey;
// you set the key, so no random key is generated
(nonce)值也是如此。
生成随机密钥只有一次意义,然后您必须以某种安全的方式在加密\解密方之间共享它,并将其用于将来的加密\解密。当你在那里时,请注意每个加密的IV
值应该是随机的,所以通常你只是将这个IV值加到加密的二进制数组中,在解密之前你从加密数组的开头剪掉那个IV并用于解密
答案 1 :(得分:0)
在这个github page上有一个用Java写的实用程序类,它使用对称算法执行加密/解密,以下可能是使用对称算法的加密流程之一:
使用所选算法(DES,3DES,AES等)生成秘密密钥
生成可用种子生成算法计算得出的种子字节的安全随机数
可能要加密的文本消息不是8字节块的倍数,这就是为什么必须用其他字节填充消息以使文本消息成为8字节块的倍数的原因(例如PKCS5Padding填充方案)< / p>
使用随机生成的安全种子字节作为初始化矢量作为分组密码