AES ECB无填充

时间:2014-08-05 09:55:13

标签: javascript encryption cryptojs

我正在尝试使用cryptojs实现AES / ECB / NoPadding。

在Java方面我有这个:

public static String encrypt(String input, String key) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    return DatatypeConverter.printHexBinary(cipher.doFinal(padToMultipleOf32(input.getBytes())));
}

public static byte[] padToMultipleOf32(final byte[] bytes) {
    int n16 = ((bytes.length + 31) / 32);
    int paddedLen = n16 * 32;

    byte[] result = new byte[paddedLen];

    for (int i = 0; i < bytes.length; i++) {
        result[i] = bytes[i];
    }

    for (int i = bytes.length; i < paddedLen; i++) {
        result[i] = 0x00;
    }

    System.out.println(new String(result).length());

    return result;
}

运行Test.encrypt(&#34; test&#34;,&#34; 4g2ef21zmmmhe678&#34;) 给我:C24F53DDEAD357510A27AA283C74BBF4638B3F81F8EB44652D424D7C32897525

我如何在cryptojs中做同样的事情,我目前无法工作:

var pwd = CryptoJS.AES.encrypt("test", "4g2ef21zmmmhe678", {
        mode : CryptoJS.mode.ECB,
        padding : CryptoJS.pad.NoPadding
    });
    expect(pwd.ciphertext.toString(CryptoJS.enc.Base64)).toEqual("C24F53DDEAD357510A27AA283C74BBF4638B3F81F8EB44652D424D7C32897525");

请帮忙

1 个答案:

答案 0 :(得分:0)

CryptoJS 的文档说,当将普通密码(即字符串)传递给encrypt ()时,它会自动生成256位密钥(Java实现128位版本)那个密码作为种子。

要防止您使用此功能直接将密码转换为密钥:

var key = CryptoJS.enc.Utf8.parse("password");

您可能还必须同步密文的编码。有关如何使用Java和 CryptoJS 执行可互操作加密的详细示例,请参阅here