So beheben Sie den Fehler „Angegebener letzter Block nicht ordnungsgemäß aufgefüllt“ beim Portieren von VerschlüsselungsJava

Java-Forum
Guest
 So beheben Sie den Fehler „Angegebener letzter Block nicht ordnungsgemäß aufgefüllt“ beim Portieren von Verschlüsselungs

Post by Guest »

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:

Code: Select all

EncryptData = bL6ZXAUGsE9+Ea9BVgrYYDJrzmtzjooHbHqc1K/YMGE=
rawData = abcd1234
Der Java-Code

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();
}
}
C#-Code

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);
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post