【发布时间】:2014-06-09 19:15:11
【问题描述】:
我有一个 php 代码,它在 EBC 模式下使用 rijndael 算法加密纯文本,密钥长度为 17 个字符。 我希望在 Java 中使用等效的 AES 算法
这是我的 php 代码:
<?php
$key=" 4288f0b8060ca1b ";
$mcryptAlgo= MCRYPT_RIJNDAEL_128 ;
$mcryptMode= MCRYPT_MODE_ECB ;
$data = "text_to_crypt_with_aes" ;
$mcryptedData = mcrypt_encrypt ($mcryptAlgo, $key, $data, $mcryptMode);
$parametres_chiffres = urlencode( base64_encode ($mcryptedData));
echo($parametres_chiffres);
?>
它返回加密消息的结果:4LepwOstJA0R2bg5FrdQXeoxesxmKV4pkf514F3VDqU%3D
但是,我构建的以下 Java 代码不会返回相同的消息:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("text_to_crypt_with_aes");
String clearText = sb.toString();
StringBuilder sbKey = new StringBuilder(" 4288f0b8060ca1b ");
for (int i = 0; i < 7; i++) {
sbKey.append("\0");
}
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
Key key = new SecretKeySpec(sbKey.toString().getBytes("UTF-8"),
"AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedMessageInBytes = cipher.doFinal(clearText
.getBytes("UTF-8"));
byte[] b64 = Base64.encodeBase64(encryptedMessageInBytes);
String scrambled_text = new String(b64, Charset.forName("US-ASCII"));
System.out.println(scrambled_text);
} catch (Exception e) {
e.printStackTrace();
}
}
它实际上返回: 4LepwOstJA0R2bg5FrdQXRutIOZlJi06f0D8NnnIG5Q=
如何调整我的 Java 代码以返回与 php 中完全相同的结果?
【问题讨论】:
-
关于选择哪种分组密码模式,我在这里写了一个描述:stackoverflow.com/a/22958889/371137。我不知道密钥用法是否能代表以后的生产用途,但如果它真的很弱,并且仅靠 60 位熵就几乎可以通过蛮力破解。
标签: java php encryption aes rijndael