1
String plain1= "Test";
byte[] cipher = SplashSecure.getInstance().encrypt2(plain1);
String plain2 = SplashSecure.getInstance().decrypt2(cipher);

普通 = 测试������������������������

解密后plainText2应该等于plaintext. 但事实并非如此。

加密/解密方法。

 public void initKey(String key) {
    String paddedKey = Utils.padString(key);
    mKeyspec = new SecretKeySpec(Utils.getBytes(paddedKey), "AES/ECB/NoPadding");
                   // Utils.getBytes returns "paddedKey.getBytes("CP1252")"
 }

public byte[] encrypt2(String data) {
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, mKeyspec);
        String paddedData = Utils.padString(data);
        return cipher.doFinal(Utils.getBytes(paddedData));

    } catch(InvalidKeyException e) {
        e.printStackTrace();
    // Series of catch blocks
    }
    return null;
}

public String decrypt2(byte[] cypherText) {
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
        byte[] plainTextBytes = cipher.doFinal(cypherText);
        return Utils.getString(plainTextBytes);
        // Utils.getString returns "new String(bytes, "CP1252");"
    } catch(InvalidKeyException e) {
        // Series of catch blocks.
    } 
    return null;
}

编辑

public static String padString(String source) {
    char paddingChar = '\0';
    int size = 16;
    int padLength = size - source.length() % size;

    for (int i = 0; i < padLength; i++) {
        source += paddingChar;
    }

    return source;
}

编辑

我试图让加密解密在 Windows(其他加密的客户端和服务器)和 Android 上工作。Windows 客户端是使用 Rijndael 类 ( http://svn.openfoundry.org/pcman/2007.06.03/Lite/Rijndael.h ) 的 VC++ 应用程序,Android 使用http://www.cs.ucdavis.edu/ ~rogaway/ocb/ocb-java/Rijndael.java。Windows 客户端已加密数据并将其存储在服务器上。我需要为 android 构建一个客户端来获取加密数据,解密并显示给用户。

我确定我使用了正确的密钥来解密。

4

1 回答 1

2

AES 的块大小为 128 位(即 16 字节)。它只能处理这种大小的块中的数据,因此即使您告诉它使用NoPadding它也无法遵守。

这里最有可能发生的事情是您使用的 AES 实现在内部将您的四个字节输入填充到 16 个字节并加密结果。当您解密时,您会得到相同的 16 个字节,即“T”、“e”、“s”、“t”和 12 个垃圾字节。

您看到的输出支持这一点:“测试”后跟 24 个?符号。我不知道为什么它?为每个垃圾字节打印两个符号,但我猜这与解释 unicode 中的垃圾字节有关。您可以通过打印出解密 blob 的原始字节值来查看发生了什么。

简短的回答是“NoPadding”对于分组密码没有意义(或者,如果您要使用 NoPadding,那么您必须自己填充和取消填充)。

于 2013-03-02T18:30:15.350 回答