【问题标题】:How can I decrypt in objective-c from a file encrypted by Java Cipher如何从 Java Cipher 加密的文件中解密 Objective-C
【发布时间】:2011-08-23 01:34:40
【问题描述】:

我在 Java 中有一个加密方法。

public static String encrypt(String orignal){
    SecretKeySpec key = new SecretKeySpec(keyString.getBytes(), "AES");
    IvParameterSpec initalVector = new IvParameterSpec(initialVectorParam.getBytes());

    try{
        Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding");
        /////////////// encrypt /////////////////
        cipher.init(Cipher.ENCRYPT_MODE, key, initalVector);
        Log.d("AES", "oriByte: "+ orignal.getBytes());
        int length = orignal.length();
        for(int i=0; i<length; i++){

        }
        byte[] test = cipher.doFinal(orignal.getBytes());
        Log.d("AES", "encByte: "+ test);
        return bytes2Hex(test);
    }catch (Exception e) {
        Log.d("AES", "Encrypt Exception:"+orignal);
        return "";
    }
}

为了与 PHP 兼容,我使用“AES/CFB8/NoPadding”选项。 在 PHP 中:$sCipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $sKey, $sStr, MCRYPT_MODE_CFB, $sIV);

我有一个来自这里的 Objective-c 密码。 https://gist.github.com/838614

我发现Objective-c Cipher和java一样没有IvParameterSpec。 此外,getBytes 方法返回与 java.xml 不同的值。 (我认为这是因为java使用了不同的编码方式。)

那么,我如何在 Objective-c 中应用 IvParameterSpec。 有什么方法可以像 Objective-c 中的 java 一样获取 'getBytes' 值?

【问题讨论】:

  • 对于getBytes(),请务必指明编码(有一个采用编码参数的重载方法)。

标签: java iphone ios encryption


【解决方案1】:

有关初始化向量,请参见您的馅饼中的第 24 行:

NULL /* initialization vector (optional) */,

那是您通过静脉注射的地方。

但是,如果不知道用于创建用作 IV 的字节的 Java 代码的字符串编码,即使您知道字符串在屏幕上显示的内容,您也无法正确地播种加密来解密数据.换句话说,仅仅因为 IV 看起来像“abc123”并不意味着 Java 写入 IV 缓冲区的字节将与您从 C 字符文字缓冲区中 strncpy() 获得的字节相同。您必须同意编码作为处理数据协议的一部分。

您还需要就密钥大小达成一致。您的 Java 代码未指定 AES 密钥中有多少位。

一旦你解决了这个问题,你会想要使用这样的调用:

const void *key = /* KEY BYTES */;
const void *iv = /* IV BYTES */;
const void *text = /* CIPHER TEXT */;
size_t textlen = /*...*/;
size_t outlen = 0;
(void)CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0/*use CBC mode*/,
        key, kCCKeySizeAES128, iv,
        text, textlen,
        &text, textlen, &outlen);

假设一切顺利,明文将覆盖密文。解密期间写入text的数据量将存储在outlen中。错误检查是您的责任;标题注释很好。

一旦你有了数据,你就会想用正确的编码把它变成一个NSString+[NSString initWithData:encoding:] 可以),然后你就有一个字符串你可以像其他任何东西一样在 Obj-C 中使用字符串。

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2021-12-29
    • 1970-01-01
    • 2011-01-27
    • 2011-03-06
    • 2016-01-21
    相关资源
    最近更新 更多