在 Java 中加密,在 C# 中解密 对于 AES 256 位
2022-09-03 12:53:31
1.我有java函数,可以加密xml文件并返回加密的字符串。
/// Java Class
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class Crypt {
public static String key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
public static byte[] key_Array = Base64.decodeBase64(key);
public static String encrypt(String strToEncrypt)
{
try
{
//Cipher _Cipher = Cipher.getInstance("AES");
//Cipher _Cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
//Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
Key SecretKey = new SecretKeySpec(key_Array, "AES");
Cipher _Cipher = Cipher.getInstance("AES");
_Cipher.init(Cipher.ENCRYPT_MODE, SecretKey);
return Base64.encodeBase64String(_Cipher.doFinal(strToEncrypt.getBytes()));
}
catch (Exception e)
{
System.out.println("[Exception]:"+e.getMessage());
}
return null;
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("xml file string ...");
String EncryptedString = encrypt(sb.toString());
System.out.println("[EncryptedString]:"+EncryptedString);
}
}
2.我有c#函数,可以解密由java函数加密的消息。
/// C# Function
private static string Decrypt(string encryptedText)
{
RijndaelManaged aesEncryption = new RijndaelManaged();
aesEncryption.BlockSize = 256;
//aesEncryption.KeySize = 256;
//aesEncryption.Mode = CipherMode.CBC;
//aesEncryption.Padding = PaddingMode.PKCS7;
string keyStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
//string ivStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
byte[] keyArr = Convert.FromBase64String(keyStr);
//byte[] ivArr = Convert.FromBase64String(ivStr);
aesEncryption.Key = keyArr;
//aesEncryption.IV = ivArr;
ICryptoTransform decrypto = aesEncryption.CreateDecryptor();
byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length);
byte[] decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); /// CryptographicException: Length of the data to decrypt is invalid.
return ASCIIEncoding.UTF8.GetString(decryptedData);
}
Java加密功能运行良好。但问题是C#函数,当我解密时,
我得到下面的错误消息
CryptographicException: Length of the data to decrypt is invalid.
我通过使用下面的ref搜索解决方案
但我仍然面临同样的错误。任何人都可以给我建议。
更新
我只是更改了我的C#加密函数。以下是我的更改列表
- 块大小为 128
- 密钥大小为 256
- IV 尺寸至 16
- 密钥大小为 32
/// Updated decrypt function
private static string Decrypt(string encryptedText)
{
RijndaelManaged aesEncryption = new RijndaelManaged();
aesEncryption.BlockSize = 128;
aesEncryption.KeySize = 256;
//aesEncryption.Mode = CipherMode.CBC;
aesEncryption.Padding = PaddingMode.None;
string keyStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
string ivStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
byte[] ivArr = Convert.FromBase64String(ivStr);
byte[] IVkey16BytesValue = new byte[16];
Array.Copy(ivArr, IVkey16BytesValue, 16);
byte[] keyArr = Convert.FromBase64String(keyStr);
byte[] KeyArr32BytesValue = new byte[32];
Array.Copy(keyArr, KeyArr32BytesValue, 32);
aesEncryption.IV = IVkey16BytesValue;
aesEncryption.Key = KeyArr32BytesValue;
ICryptoTransform decrypto = aesEncryption.CreateDecryptor();
byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length);
byte[] decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
return ASCIIEncoding.UTF8.GetString(decryptedData);
}
此时,不会发生任何错误。但是我收到解密的消息,我无法阅读。
g:�\0�\td��Y\\符O����\rL��W�wHm�>f�\au����%��0��\ ..........
请让我再次得到你的建议。