使用 AES 在 C# 中加密字符串的 Java 解密

时间:2021-06-03 16:33:41

标签: java c# cryptography aes

我正在尝试编写与以下 c# 代码等效的代码来解密 Java 中的字符串。

public string Decrypt(string cipherText) 
{ 
     if (!IsBase64String(cipherText)) 
         throw new Exception("The cipherText input parameter is not base64  encoded"); 
     string text; 
     var key = new Rfc2898DeriveBytes(EncryptionKey, SALT); 
     var aesAlg = new RijndaelManaged(); 
     aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8); 
     aesAlg.IV = key.GetBytes(aesAlg.BlockSize / 8); 
     var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);  var cipher = Convert.FromBase64String(cipherText); 
     using (var msDecrypt = new MemoryStream(cipher)) 
     { 
         using (var csDecrypt = new CryptoStream(msDecrypt, decryptor,  CryptoStreamMode.Read)) 
         { 
             using (var srDecrypt = new StreamReader(csDecrypt)) 
             {
                 // Internal 
                 text = srDecrypt.ReadToEnd(); 
             } 
         } 
     } 
     return text; 
 } 

这是我尝试过的:

final String password = "password";
byte[] salt = []; //salt provided here

String string = "something";
System.out.println(string.length());
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1000, 256);
SecretKey tmp = factory.generateSecret(spec);

SecretKeySpec secret = new SecretKeySpec(tmp.getEncoded(), "AES");

byte[] data = Base64.getDecoder().decode(string);
System.out.println(data.length);
// skip first 4 bytes (the length of IV) and get IV byte array
byte[] iv = Arrays.copyOfRange(data, 16, 32);

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
// skip IV length (4 bytes) and IV (16 bytes)
cipher.update(data, 32, data.length - 32);
String plaintext = new String(cipher.doFinal(), "UTF-8");
System.out.println(plaintext);

出现以下异常: javax.crypto.BadPaddingException:给定的最终块未正确填充。如果在解密过程中使用了错误的密钥,就会出现此类问题。

不知道哪里出错了

0 个答案:

没有答案