AES encryption/decryption 从 Android 到服务器

AES encryption/decryption from Android to server

我有一台服务器和两个客户端。服务器使用 Java 和 Jersey (Rest) 运行。 一个客户是 Java 客户,另一个是 Android 客户。

我想发送用 AES 加密的邮件。所以我有这段代码(在服务器和客户端上):

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

public String crypterMessage(String message) {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        String messageCrypte = new String(Hex.encodeHex(cipher.doFinal(message.getBytes())));
        mIv = cipher.getIV();
        return messageCrypte;
}

public String decrypterMessage(String messageCrypte) {
        IvParameterSpec ivParameterSpec = new IvParameterSpec(mIv);
        cipher.init(Cipher.DECRYPT_MODE, obtenirCleSecrete(), ivParameterSpec);
        return new String(cipher.doFinal(Hex.decodeHex(messageCrypte.toCharArray())));
}

当我从 Java 客户端发送加密消息时,服务器对其进行解密并加密响应。 Java 客户端解密响应。它完美运行。

但是当Android客户端发送加密消息时,服务器无法解密。我有一个 BadPaddingException : "Given final block not properly padded" 在服务器上。

服务器和java客户端使用SunJCE,Android客户端使用AndroidOpenSSL作为提供者。

Android 有什么问题?

PS :我使用 org.apache.commons 中的 Hex.encode 和 Hex.decode。我在 Android.

上使用 Spring

编辑

我发现了问题,但我不知道为什么。我有这个代码:

KeyGenerator generateurCle = KeyGenerator.getInstance("AES");
        SecureRandom securite = SecureRandom.getInstance("SHA1PRNG");
        securite.setSeed(mCleCryptage.toByteArray());
        generateurCle.init(128, securite);
        mCleSecrete = generateurCle.generateKey();

服务器和客户端的变量"mCleCryptage"相同。但是 "mCleSecrete" 服务器和 Android 客户端之间是不同的。服务器和 Java 客户端具有相同的密钥。

我不明白,因为它们都有相同的class,相同的代码。

我找到了解决办法。问题是 securite.setSeed()。 你可以在第一个post

中看到解决方案here