精易论坛

标题: Aes加密模式、填充模式、数据块、Key和IV参数疑惑请教 [打印本页]

作者: lyn2018    时间: 2019-12-10 11:53
标题: Aes加密模式、填充模式、数据块、Key和IV参数疑惑请教
  1. public static string AesEncrypt(string input, string password, string salt)
  2. {
  3.         byte[] bytes = Encoding.UTF8.GetBytes(input);
  4.         byte[] bytes2 = Encoding.UTF8.GetBytes(salt);
  5.         using (AesManaged aesManaged = new AesManaged())
  6.         {
  7.                 Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, bytes2);
  8.                 aesManaged.BlockSize = aesManaged.LegalBlockSizes[0].MaxSize;
  9.                 aesManaged.KeySize = aesManaged.LegalKeySizes[0].MaxSize;
  10.                 aesManaged.Key = rfc2898DeriveBytes.GetBytes(aesManaged.KeySize / 8);
  11.                 aesManaged.IV = rfc2898DeriveBytes.GetBytes(aesManaged.BlockSize / 8);
  12.                 using (ICryptoTransform transform = aesManaged.CreateEncryptor())
  13.                 {
  14.                         MemoryStream memoryStream = new MemoryStream();
  15.                         using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
  16.                         {
  17.                                 cryptoStream.Write(bytes, 0, bytes.Length);
  18.                         }
  19.                         return Convert.ToBase64String(memoryStream.ToArray());
  20.                 }
  21.         }
  22. }
复制代码
C#AES加密函数如上,
三个已知参数如下:
input=BBBBBB|123456
SecretKey Password = "Z_h$W@123";
SecretKey Salt = "123@Z_h$W";

究竟请问在http://tool.chacuo.net/cryptaes怎样填写加密模式、填充模式、数据块、Key和IV这几个关键参数才可以得到和C# 的 Cryptography.AesEncrypt同样的结果:dn78uzHKtqCh936l0fbQ4A==


作者: lyn2018    时间: 2019-12-10 12:04
key应该是密钥,用密码+salt+迭代然后hash之后得到的
作者: 竹竹    时间: 2019-12-10 13:30
参考这个页面https://www.jianshu.com/p/81e8ea00747d
作者: qingshanlushui    时间: 2019-12-10 14:02

如图.....在线网站不支持base64格式key和iv...utf8格式key和iv存在不可见字符
base64 key:kJQkmJBeaAHHxMzwd18WT129AG3mtWlL59Em9qAVgew=
base64 iv:qkXFhdqkXFhdnuBrhiMRHG7Eo/SQ==
CBC 模式pkc7填充

作者: Codebug    时间: 2019-12-10 14:24
如果password和salt是固定的

直接输出一下key和iv不就行了
作者: lyn2018    时间: 2019-12-10 18:36
本帖最后由 lyn2018 于 2019-12-10 19:09 编辑
竹席 发表于 2019-12-10 13:30
参考这个页面https://www.jianshu.com/p/81e8ea00747d

好的,谢谢这位兄台!
作者: lyn2018    时间: 2019-12-10 18:40
qingshanlushui 发表于 2019-12-10 14:02
如图.....在线网站不支持base64格式key和iv...utf8格式key和iv存在不可见字符
base64 key:kJQkmJBeaAHHx ...

大神你让我看到了希望,我自己折腾捣鼓了5天5夜
作者: lyn2018    时间: 2019-12-10 18:56
qingshanlushui 发表于 2019-12-10 14:02
如图.....在线网站不支持base64格式key和iv...utf8格式key和iv存在不可见字符
base64 key:kJQkmJBeaAHHx ...

太好了!!终于解决了!!!谢谢这位兄台!!实在感激~!!
PS,
base64 iv:qkXFhdqkXFhdnuBrhiMRHG7Eo/SQ==
可能天气冷大神你手抖了一下
作者: qingshanlushui    时间: 2019-12-10 20:24
lyn2018 发表于 2019-12-10 18:56
太好了!!终于解决了!!!谢谢这位兄台!!实在感激~!!
PS,
base64 iv:qkXFhdqkXFhdnuBrhiMRHG7Eo ...

哈哈..你好细心和耐心.....五天五夜,要是我早就放弃了.....
作者: lyn2018    时间: 2019-12-11 15:09
qingshanlushui 发表于 2019-12-10 20:24
哈哈..你好细心和耐心.....五天五夜,要是我早就放弃了.....

  1. aesManaged.Key = rfc2898DeriveBytes.GetBytes(aesManaged.KeySize / 8);
  2.                 aesManaged.IV = rfc2898DeriveBytes.GetBytes(aesManaged.BlockSize / 8);
复制代码

如上图,PBKDF2计算出Key的Hash值转base64即密钥kJQkmJBeaAHHxMzwd18WT129AG3mtWlL59Em9qAVgew=
请问,IV :aesManaged.IV = rfc2898DeriveBytes.GetBytes(aesManaged.BlockSize / 8) 如何通过PBKDF2算出来呢?
百毒了很多资料对C#的rfc2898DeriveBytes、GetBytes概念还是很模糊,主要想通过CryptoJS直接计算IV

aesManaged.Key的CryptoJS计算函数(感谢qingshanlushui):
  1. var key = CryptoJS.enc.Base64.parse("kJQkmJBeaAHHxMzwd18WT129AG3mtWlL59Em9qAVgew=");
  2. var iv = CryptoJS.enc.Base64.parse("qkXFhdnuBrhiMRHG7Eo/SQ==");
  3. function AES_Encrypt(word) {
  4.     var srcs = CryptoJS.enc.Utf8.parse(word);
  5.     var encrypted = CryptoJS.AES.encrypt(srcs, key, {
  6.         iv: iv,
  7.         mode: CryptoJS.mode.CBC,
  8.         padding: CryptoJS.pad.Pkcs7
  9.     });
  10.     return encrypted.toString();
  11. }

  12. function AES_Decrypt(word) {
  13.     var srcs = word;
  14.     var decrypt = CryptoJS.AES.decrypt(srcs, key, {
  15.         iv: iv,
  16.         mode: CryptoJS.mode.CBC,
  17.         padding: CryptoJS.pad.Pkcs7
  18.     });
  19.     return decrypt.toString(CryptoJS.enc.Utf8);
  20. }
复制代码





作者: lyn2018    时间: 2019-12-14 00:35
iv获取尚未成功,同志还需努力
作者: lyn2018    时间: 2019-12-19 18:39
最终还是通过node.js解决了IV参数,谢谢各位大神了!




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4