【发布时间】:2020-12-09 17:05:48
【问题描述】:
在 C# 中,他们使用以下代码生成密钥。
using System;
using System.Text;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
var aesEncryption = new RijndaelManaged
{
KeySize = 128,
BlockSize = 128,
Mode = CipherMode.CBC,
Padding = PaddingMode.PKCS7
};
aesEncryption.GenerateIV();
string ivStr = Convert.ToBase64String(aesEncryption.IV);
aesEncryption.GenerateKey();
string keyStr = Convert.ToBase64String(aesEncryption.Key);
string completeKey = Convert.ToBase64String(ASCIIEncoding.UTF8.GetBytes(ivStr + "," + keyStr));
// Console.WriteLine(completeKey);
}
}
完整密钥示例:SENTUkR2QjZ1ZjBYV0o2aXNCcnRqQT09LDJpdTZHMUpWYm0rbTQ2Njl6ZG83Z2c9PQ==
在 Java 中,我如何解码 completeKey 以获得 IV 和 Key。我使用了下面的代码,并且 Key 和 IV 不是 128 位,我的加密失败了。
import java.util.Base64;
public class HelloWorld{
public static void main(String []args){
String originalInput = "SENTUkR2QjZ1ZjBYV0o2aXNCcnRqQT09LDJpdTZHMUpWYm0rbTQ2Njl6ZG83Z2c9PQ==";
String decodedString = new String(Base64.getDecoder().decode(originalInput.getBytes()));
String[] arrOfStr = decodedString.split(",", 2);
String iv=arrOfStr[0];
String key=arrOfStr[1];
System.out.println(decodedString);//HCSRDvB6uf0XWJ6isBrtjA==,2iu6G1JVbm+m4669zdo7gg==
System.out.println(iv);//HCSRDvB6uf0XWJ6isBrtjA==
System.out.println(key);//2iu6G1JVbm+m4669zdo7gg==
}
}
【问题讨论】:
-
欢迎来到 Stackoverflow。密钥 & iv 也是 Base64 编码的,因此只需对它们进行解码并使用生成的字节数组作为 SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 的输入和 IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
-
通常当 c# 和 java 之间存在加密问题时,填充模式是错误的。
-
你将 IV 和 key 存储在一起的方式很奇怪,首先它是 base64 编码两次,第二个 key 和 IV 在一起(IV 不是秘密它应该按照定义随机生成,只需放 IV到加密数据)。
标签: java c# encryption decode encode