如何在objective-c中解密由Java Cipher加密的文件



我在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"选项。$sCipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $sKey, $sStr, MCRYPT_MODE_CFB, $sIV);

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

我发现没有IvParameterSpec在Objective-c Cipher像java。此外,getBytes方法在java中返回一个不同的值。(我认为这是因为java使用不同的编码方式。)

那么,我如何在Objective-c中应用IvParameterSpec。是否有任何方法来获得'getBytes'值像java在Objective-c?

对于初始化向量,请参见您的应用程序中的第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 initWithData:encoding:]将工作)将其吸进NSString,然后你有一个字符串,你可以从Obj-C工作,像任何其他字符串。

最新更新