So beheben Sie den Fehler „Angegebener letzter Block nicht ordnungsgemäß aufgefüllt“ beim Portieren von Verschlüsselungs
Posted: 14 Jan 2025, 11:59
Dies ist eine C#-Verschlüsselungsmethode, ich möchte sie auf Java verwenden. Mein Code zeigt immer:
Der angegebene letzte Block ist nicht richtig aufgefüllt. Solche Probleme können auftreten, wenn bei der Entschlüsselung ein ungültiger Schlüssel verwendet wird.
Können Sie bei der Portierung dieses C#-Codes nach Java helfen?
Der C#-Code:
Der Java-Code
C#-Code
Der angegebene letzte Block ist nicht richtig aufgefüllt. Solche Probleme können auftreten, wenn bei der Entschlüsselung ein ungültiger Schlüssel verwendet wird.
Können Sie bei der Portierung dieses C#-Codes nach Java helfen?
Der C#-Code:
Code: Select all
EncryptData = bL6ZXAUGsE9+Ea9BVgrYYDJrzmtzjooHbHqc1K/YMGE=
rawData = abcd1234
Code: Select all
public static String Decrypt(String cipherText) {
byte[] cipherBytes = Base64.getDecoder().decode(cipherText);
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(Password.toCharArray(), SALE, 100, 48 * 8);
byte[] keyBytes = factory.generateSecret(spec).getEncoded();
byte[] key = new byte[32];
byte[] iv = new byte[16];
System.arraycopy(keyBytes, 0, key, 0, 32);
System.arraycopy(keyBytes, 32, iv, 0, 16);
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decryptedBytes = cipher.doFinal(cipherBytes);
return new String(decryptedBytes, StandardCharsets.UTF_16LE);
} catch (Exception e) {
return e.getMessage();
}
}
Code: Select all
public static string Decrypt(string cipherText)
{
string Password = "abcde~1234";
byte[] cipherBytes = Convert.FromBase64String(cipherText);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] {0x49, 0x20, 0x4d, 0x65,
0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
MemoryStream ms = new MemoryStream();
Aes alg = Aes.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
CryptoStream cs = new CryptoStream(ms,
alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
byte[] decryptedData = ms.ToArray();
return Encoding.Unicode.GetString(decryptedData);
}
public static string Encrypt(string clearData)
{
string Password = "abcde~1234";
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password,
new byte[] {0x49, 0x20, 0x4d, 0x65,
0x64, 0x76, 0x65, 0x64, 0x65, 0x76});
Aes alg = Aes.Create();
alg.Key = pdb.GetBytes(32);
alg.IV = pdb.GetBytes(16);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,
alg.CreateEncryptor(), CryptoStreamMode.Write);
byte[] clearDataBytes = Encoding.Unicode.GetBytes(clearData);
cs.Write(clearDataBytes, 0, clearDataBytes.Length);
cs.Close();
byte[] encryptedData = ms.ToArray();
return Convert.ToBase64String(encryptedData);
}