2011-08-23 111 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:]都可以),然後你就可以與對象 - 工作就像任何其他字符串的字符串。