NSDATAをCommonCryptoを介して暗号化から戻ってきたNSSTRINGに変換した後、私のinitWithDataがエラーを示すnilを返すのはなぜですか?
-
26-10-2019 - |
質問
これが私のコードです:
-(IBAction)encryptText:(id)sender
{
key = self.tvKey.text;
CCCryptorStatus status = kCCSuccess;
algorithm = kCCAlgorithmAES128;
CCOptions opts = kCCOptionPKCS7Padding;
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
NSString *plainString = [NSString stringWithFormat:@"%@", self.tvEntryText.text];
NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [plainData dataEncryptedUsingAlgorithm: algorithm
key: keyData
initializationVector: nil
options: opts
error: &status];
if ( status != kCCSuccess ) {
NSError * err = [NSError errorWithCCCryptorStatus: status];
self.lblKeyMsg.text = [NSString stringWithFormat:@"Encryption failed: %s", [[err localizedDescription] UTF8String]];
self.lblKeyMsg.textColor = [UIColor redColor];
return;
}
NSString *encryptedString = [[[NSString alloc] initWithData:encryptedData encoding:NSUTF8StringEncoding] autorelease];
self.tvResultText.text = encryptedString;
}
2番目から最後のステートメントは、暗号化されたNSDATAをディスプレイの目的でNSStringに変換していますが、NILに戻ります。 nilは有効な応答とエラーを示しています。私はその声明が実行された直後に実行を停止しました、そして、ここにVauesがあります:
(gdb) po keyData
<61616161 61616161 61617373 73737373 73737373 64646464 64646464 64646666>
(gdb) po key
aaaaaaaaaassssssssssddddddddddff
(gdb) po plainString
this is a test.
(gdb) po plainData
<74686973 20697320 61207465 73742e>
(gdb) po encryptedData
<f7074146 b295e340 0d947d53 9ea629cf>
(gdb) po encryptedString
Can't print the description of a NIL object.
(gdb) po status
Can't print the description of a NIL object.
(gdb)
ステータスは、暗号化にエラーがなかったことを示しています。すべての値は予想通りに見えますが、initdataは失敗します。これがiPhoneビューの操作です:
なぜここで初期dataが失敗しているのですか?
解決
ドキュメントが言うように、 initWithData:encoding:
渡されたデータがエンコードの有効なデータではない場合、ゼルを返すことがあります。一部のエンコーディングとは異なり、任意のデータを取得してUTF8データのふりをすることはできません。UTF8仕様に準拠する必要があります。
君の encryptedData
NSDATAオブジェクトには、一見ランダムデータが含まれています - 有効なUTF8データである可能性は非常に低いので initWithData:encoding:
失敗する可能性が非常に高いです。
テキストボックスに貼り付けることができるものを探しているだけなら、暗号化されたデータをエンコードするBase64を試してみてください。
所属していません StackOverflow