【发布时间】:2019-11-01 01:52:57
【问题描述】:
我收到了需要转换为 C# 的 Java 加密代码。我想我已经很接近了……但我不确定如何复制 IV 计算……有什么帮助吗?
Java 代码:
public static string getAESencodingResult(String sSrc, String encrypt_key)
{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] raw = encrypt_key.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
IvParameterSpec iv = new IvParameterSpec(encrypt_key.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
return new BASE64Encoder().encode(encrypted);
}
C# 代码:
static string EncryptStringToBytes(string plainText, byte[] key)
{
byte[] encrypted;
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
rijAlg.Key = key;
// rijAlg.IV = ???
rijAlg.GenerateIV();
rijAlg.Padding = PaddingMode.PKCS7;
rijAlg.Mode = CipherMode.CBC;
ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(plainText);
if (plainText.Length < 16)
{
for (int i = plainText.Length; i < 16; i++)
swEncrypt.Write((byte)0x0);
}
swEncrypt.Flush();
csEncrypt.FlushFinalBlock();
encrypted = msEncrypt.ToArray();
}
}
return Convert.ToBase64String(encrypted);
}
【问题讨论】:
-
看起来键同时用作键和初始化向量,这不是一个好主意。有关 Key vs IV 的更多信息,请参阅here。
-
我也在想同样的事情......但是 Java 代码来自第三方,我必须让它以同样的方式工作。
-
我在 Java 方面不是 100% 确定的,但只是将关键字节分配给 C# 中的
IV属性,然后删除GenerateIV()行吗? -
是的...他们给我发了一些样本数据,它匹配...谢谢!...我刚刚使用 rijAlg.IV = key;...我只是认为必须有更多!
-
好的。我现在添加了一个答案,我知道它有效! :-)
标签: java c# encryption aes