[英]How can I decrypt in objective-c from a file encrypted by 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”选项。 在PHP中:$ sCipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$ sKey,$ sStr,MCRYPT_MODE_CFB,$ sIV);
我有一个Objective-c Cipher代码。 https://gist.github.com/838614
我发现在Objective-c Cipher中没有像java这样的IvParameterSpec。 此外,getBytes方法使用java返回不同的值。 (我认为这是因为java使用不同的编码方式。)
那么,我如何在Objective-c中应用IvParameterSpec。 有没有办法在Objective-c中获得像'java'这样的'getBytes'值?
有关初始化向量,请参阅pastie中的第24行:
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 initWithData:encoding:]
可以工作)将它插入一个NSString
,然后你就可以使用Obj-C中的一个字符串了串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.