2015-11-05 81 views
1

問題完美的工作是在IOS隨機生成的PHP IV未在IOS

解碼的情況是我使用Blowfish算法CBC模式時的基64編碼的四(在PHP)不匹配。簡單的服務器(PHP)生成一個隨機加密IV 和編碼的base64格式,發送到IOS。 問題在這裏,當我嘗試解碼時,解碼結果總是不正確。有時它會產生正確的和剩餘的時間錯誤。

這是我的PHP代碼。

public function ivGenerator() 
{ 
    $ivSize = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC); 
    $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); 
    echo base64_encode($iv); 

} 

下面是兩個結果集ivGenerator的,我將在以後使用解碼

bTpkpLxMbNo= 
aIvJeujxW7w= 

這裏是我的IOS代碼。

NSString *ecodedIVString = @"bTpkpLxMbNo=";  
NSData *ecodedIVData= [[NSData alloc] initWithBase64EncodedString:ecodedIVString options:0]; 
NSString *decodeIVString = [[NSString alloc] initWithData:ecodedIVData encoding:NSASCIIStringEncoding]; 
NSLog(@"decodeIVString %@" , decodeIVString); // m:d¤¼LlÚ //its correct 

如果使用,

NSString *ecodedIVString = @"aIvJeujxW7w="; 

那麼結果是hÉzèñ[¼,但實際的結果應該是ħ<Ézèñ[¼

我試圖

NSWindowsCP1252StringEncoding , NSISOLatin1StringEncoding ,  NSUTF8StringEncoding 

但是他們都無法產生準確的結果(約。 10次​​測試我找到了)。

在此先感謝!

+1

不要使用'MCRYPT_RAND' - 它沒有任何隨機性,它不是密碼安全的。改爲使用'MCRYPT_DEV_URANDOM'。 – Narf

+0

你嘗試過'NSUTF32StringEncoding'嗎? –

+0

沒有工作@Albert Renshaw –

回答

1

你應該打印出十六進制結果,然後進行比較。

看起來,兩個平臺上的編碼是相同的(你不應該認爲是理所當然的),所以你會得到相同的字符。但是,不確定您正在使用的字體的或字體版本是否顯示字符。也可能是一個平臺顯示未知編碼序列的字符,而另一個平臺不顯示任何內容。

這給我們帶來了一個基本問題:如果您解碼隨機字節值,那麼您可能會遇到不轉換爲字符的字節序列。因此,通過將二進制字符串轉換爲可打印字符串來比較二進制字符串並不好相反,您需要直接比較字節(例如,通過將IV保存到iv.bin文件)或將它們轉換爲十六進制。

儘管打印輸出不同,但IV很可能是相同的。

+0

是的,它的工作!謝謝 –