【发布时间】:2020-08-27 05:15:26
【问题描述】:
Java code
public String encrypt(String key, String value) {
try {
String initVector = "RgUkXp2s5v8y/B?E";
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(hashKey(key), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(1, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
private byte[] hashKey(String keyValue) throws NoSuchAlgorithmException, UnsupportedEncodingException {
byte[] key = keyValue.getBytes("UTF-8");
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
key = messageDigest.digest(key);
return Arrays.copyOf(key, 16);
}
public static String decrypt(byte[] key, String encrypted)
{
try
{
String initVector = "RgUkXp2s5v8y/B?E";
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(2, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted));
return new String(original);
}
catch (Exception ex)
{
Logger.getLogger("Decryption ").log(Level.SEVERE, "Exception processing decryption " + ex.getMessage());
return null;
}
}
String encryptedLicense = ENCRYPT.encrypt(string_key, stringToEncrypt);
converted c# code
public static byte[] getDefaultKey()
{
return DecryptUtil.hashKey(DecryptUtil.getUniqueIdentifier());
}
private static byte[] hashKey(string keyValue)
{
try
{
var sha1 = SHA1Managed.Create();
byte[] inputBytes = Encoding.UTF8.GetBytes(keyValue);
byte[] outputBytes = sha1.ComputeHash(inputBytes);
return outputBytes;
}
catch (Exception ex)
{
ErrorLogger.WriteToFile("hashKey " + ex.Message.ToString());
}
return null;
}
public static string Decrypt_License(string encryptedText, byte[] key)
{
string initVector = "RgUkXp2s5v8y/B?E";
var ivBytes = Encoding.UTF8.GetBytes(initVector);
var keyBytes = new byte[16];
Array.Copy(key, keyBytes, Math.Min(keyBytes.Length, key.Length));
string plaintext = null;
// Create AesManaged
using (AesManaged aes = new AesManaged())
{
aes.Padding = PaddingMode.PKCS7;
aes.Key = keyBytes;
aes.IV = ivBytes;
aes.BlockSize = 128;
aes.KeySize = 128;
aes.Mode = CipherMode.CBC;
ICryptoTransform decryptor = aes.CreateDecryptor(keyBytes, ivBytes);
using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(encryptedText)))
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
{
using (StreamReader reader = new StreamReader(cs))
plaintext = reader.ReadToEnd();
}
}
}
return plaintext;
}
String decryptedString = DecryptUtil.Decrypt_License(hashkey(string_key), stringToDecrypt);
我正在将 java 代码转换为 c#,在 java 中完成加密现在我正在尝试解密 c# 中的数据。我读过 PaddingMode.PKCS7 和 PKCS5 都是一样的。这是真的吗?还是我应该更改填充类型?
我已经使用了 java 中使用的所有概念。但它不工作。我错过了什么吗?
我对 Convert.FromBase64String(encryptedText) 有疑问,因为这是他们 (java) 使用 value.getBytes() 的地方。 c# 中的 getBytes() 等效项是 Convert.FromBase64String()?它们会产生相同的结果吗?
Java hashkey() 方法和 C# hashkey 方法给出不同的结果。如何将它们作为 byte[] 进行比较?
如果我将 Convert.FromBase64String() 更改为 Encoding.UTF8.GetBytes() 那么它会抛出“要解密的数据长度是无效的 AES C#”错误。
这是我的加密文本 wJZESOEPNb66FbnpB8DqmwLcyosxGOjzgPKa9 + 7 / VUatEFxSs1YqS28HHU26EmCcZDo7otE5PvX / qIpgQgTrhlCHgUJBb0 + qd522 / 1egYoisE48ZL8X3cwCNx1AOVYJ0T2VOLB + J3HDWK4HOJfgm2CqbQpep0ioOTgNKQA0SF3SRmF92MGbf7wjUBA8WGdeUiIKRX9Lm / x6mUUuXHEIrCHbZOqDZvo2xR9zndIzwT / FfgLsQbJQjRjZPg7urfWLpUt6drbYcPFm3KgTmSrsRhzk15P6mw3GNO + 3BmqBIndKmzi8blQqG8YFXVW8wiaurCm0jVcX5kwdU1PO1ktHSXQ == P>
用于加密的密钥 BFEBFBFF000306D4
【问题讨论】:
-
您是否要清理代码并添加一些大写字母并拆分 C# 和 Java?现在确实显示出足够努力的问题不太可能吸引到好的答案。
-
严格来说,PKCS#5 和 PKCS#7 填充是不同的,PKCS#5 在 AES 的上下文中是不可能的。但是,由于更多的历史原因,
PKCS5Padding被许多库(例如 Java)用作 PKCS#7 填充的标识符,请参阅here。您为什么要注释掉 C# 代码中有关 SHA-1 的hashKey中的行?我怀疑这是 the (或至少一个)错误。在 Java 代码中使用了 SHA-1! -
因此您使用“密钥”作为 Java 中加密/解密的输入,例如字符串 string_key = "BFEBFBFF000306D4";然后 ..ENCRYPT.encrypt(string_key... ?请分享在加密方面使用的明文,以查看 Java 加密给出了加密文本(我不相信)。
-
对不起,我没有确切的纯文本。请使用任何文本并尝试使用密钥对其进行解密。
-
请查看我的编辑 - 我在 C# 上的解密非常有效,所以我只能猜测您的密钥错误或您的加密文本不适合正在使用的密钥。
标签: java c# encryption aes