java - 如何从 Java Cipher 加密的文件中解密 objective-c

标签 java iphone ios encryption

我在 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.getBytes 不同。 (我认为这是因为java使用了不同的编码方式。)

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

最佳答案

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

NULL /* initialization vector (optional) */,

那是您将通过 IV 的地方。

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

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

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

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 中使用它。

关于java - 如何从 Java Cipher 加密的文件中解密 objective-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155420/

相关文章:

ios - UITableView 重新加载部分顺序很重要吗?

c# - 如何在 Monotouch 中绑定(bind) NSObject<UIGestureRecognizerDelegate>?

ios - DBAccess:是否支持长长值?

Java 注解处理器 getEnshingElement() 方法

java - Java中求最大数

java - 数据库到 GUI 或数据库到对象到 GUI

iphone - 在运行时检测 iPhone 上的 UDID 欺骗

iphone - UITableView 动态添加单元格

java - 如何比较 ArrayList 中的 ArrayList 之间的 Int? (java)

iphone - 如果我安装 iPhone 操作系统的 SDK 4.0,我仍然能够创建非 4.0 iPad 应用程序吗?