簡體   English   中英

如何從Java Cipher加密的文件中解析objective-c

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM