2009-09-13 22 views
15

我有一個iPhone應用程序使用CCCrypt(AES256)和明文密鑰加密輸入的NSString。字符串和鍵被賦予加密方法,該方法返回一個NSData對象。在obj-c中將NSData加密爲NSString?

請求[數據說明其中「數據」是加密的字符串數據給出一個NSString像:「< 0b368353 a707e7de 3eee5992 ee69827e e3603dc2 b0dbbc0b 861ca87d f39ce72a>」,但是當我試圖將其轉換成一個NSString,我得到「(空值)」。

我需要返回一個NSString給用戶,它可以用於使用相同的明文密鑰解密回原始字符串。如果NSData對象的'description'屬性可以返回一個字符串,是否有任何方法可以從NSData對象生成一個NSString而不會得到「(null)」?

更新:感謝奎因,誰建議使用Base64編碼產生混亂的字符串。據我所知,Base64編碼不會簡單地交換字符,但字符交換取決於位置,所以這很好。

我唯一擔心的是我希望能夠使用「密碼」加密消息,並且需要在混淆的字符串需要解碼時輸入相同的密碼短語 - 任何人都可以提出實現此方法的方法嗎?

+0

我已經更新了我的答案,以解決下面的問題。你是對的,Base64不是一種替代算法 - 它基本上將3個字節擴展爲4個字節,所以編碼數據是其非編碼數據的1.37倍。基本上,它需要3個8位塊並將其重新分爲4個6位塊,然後將每個塊重新解釋爲8位塊,這些塊可以很容易地用ASCII表示。維基百科有更多的細節。 –

回答

32

首先,請勿使用-[NSData description]爲此目的創建NSString。 (最好把-description作爲調試輸出,我很抱歉如果my previous answer誤導了你,我只是打印說明以證明NSData可以被加密和解密。)相反,使用NSString的-dataUsingEncoding:-initWithData:encoding:方法在NSData和NSString之間進行轉換。即使有這些,請注意,AES加密的數據可能不會很好地轉換爲字符串,因爲某些字節序列不會很好地播放,所以在創建字符串之前對數據進行編碼是一個好主意。

我建議你試試Base64 encoding的NSData,因爲Base64數據總是可以表示爲ASCII字符串。 (當然,當你這樣做,你就必須解密之前,從Base64編碼進行解碼。)

這裏有一些有用的資源...


編輯:我是假設你對我的回答對NSString對象的AES加密結合這your previous question。將數據編碼爲Base64不會對數據本身造成任何限制 - 它當然可以是AES-Enrypted數據本身。這裏是做什麼,如果你只是想串輸入和輸出:

  • 加密
    • 提供NSString的進行加密,並使用加密的口令。
    • 將字符串轉換爲NSData並對其執行AES加密(請參閱上一個問題)。
    • Base64編碼NSData,然後創建並返回編碼輸出的NSString。
  • 解密
    • 提供加密的和編碼的字符串,和用於解密的口令。
    • 從第一個字符串創建一個NSData,然後Base64解碼數據。
    • 對數據執行AES解密,然後創建並返回NSString。

這真的只是一個兩個部分串聯起來,並在出路相反順序執行他們的問題。從我以前的回答中,您可以修改encryptString:withKey:以執行最後一步並返回一個字符串,並將decryptData:withKey:更改爲decryptString:withKey:並接受兩個字符串。這非常簡單。

+3

+1和感謝NSDataAdditions的鏈接,非常有用! –

+0

@FreeAsInBeer編輯它們時,請不要將其他人的答案標記爲社區Wiki。這不是它的目的。 –

+0

@QuinnTaylor FAQ說明您是唯一專門訪問社區Wiki複選框的人。我的編輯可能會無意中導致它進入社區Wiki模式,但這完全是無意的。請不要指責別人做他們不能做的事情。 [參考](http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts/11741#11741) – FreeAsInBeer

2

我已經爲NSData和NSString提供了完整的類別包,爲字符串提供AES256加密。

有關詳細信息,請參見my answer「原始」問題。