C# 对称算法的密钥生成
我有一个简单的对称加密/解密应用程序,运行良好:C# 对称算法的密钥生成,c#,encryption,C#,Encryption,我有一个简单的对称加密/解密应用程序,运行良好: namespace Crypto { class Program { public static void EncryptSomeText() { string original ="My secretdata!"; using (SymmetricAlgorithm symmetricAlgorithm = new Ae
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();
当您访问
SymmetricAlgorithm
的key
属性时,会生成随机键,前提是您没有将该键
设置为某个预定义键。它不是在构造对称算法
本身时生成的
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
IV
(nonce)值也是如此
生成随机密钥只需要一次,然后您必须以某种安全的方式在加密\解密方之间共享它,并将其用于将来的加密\解密。当您在那里时,请注意,IV
值对于每个加密都应该是随机的,所以通常你只需将IV值前置到加密的二进制数组中,然后在解密之前,从加密数组的开头剪切IV并用于解密。在这个github上有一个用Java编写的实用程序类,它使用对称算法执行加密/解密,下面可能是使用对称算法的加密流之一:
- 使用所选算法(DES、3DES、AES等)生成密钥
- 生成使用可用种子生成算法计算的安全随机种子字节数
- 可能要加密的文本消息不是8字节块的倍数,这就是为什么必须用额外的字节填充消息,使文本消息成为8字节块的倍数。(例如,PKCS5P添加填充方案)
- 使用随机生成的安全种子字节作为分组密码的初始化向量
- 使用对称密钥和分组密码初始化密码函数
- 完成加密
- 使用选定的初始化向量(IV)标准和加密的二进制数据将二进制编码应用于文本编码
- 在发送之前定义消息格式,以便将消息拆分为IV,并在接收方进行加密解密