从Android到服务器的AES加密/解密

时间:2015-05-23 08:28:10

标签: java android encryption aes

我有一台服务器和两台客户端。服务器运行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:"给定最后一个块没有正确填充"在服务器上。

服务器和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客户端具有相同的密钥。

我不明白,因为所有人都有相同的课程,相同的代码。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。问题是securite.setSeed()。 您可以在第一篇文章中看到解决方案here