2011-08-23 76 views
0

我有一个Java加密方法。我如何从Java加密文件加密的文件中解密objective-c

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密码中没有像java这样的IvParameterSpec。 此外,getBytes方法返回一个与java不同的值。我认为这是因为java使用不同的编码方式。)

那么,我该如何在Objective-c中应用IvParameterSpec。 有没有什么办法可以像Objective-C中的java那样获得'getBytes'的值?

+1

对于'getBytes()',一定要指明编码(有一个重载方法需要一个编码参数)。 –

回答

2

对于初始化向量,请参阅第24行中的pastie:

NULL /* initialization vector (optional) */, 

这就是你会通过你的IV。

但是,如果不知道编码用于创建用作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:]都可以),然后你就可以与对象 - 工作就像任何其他字符串的字符串。