1

これが私のコードです:

-(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 は、エラーを示す有効な応答です。そのステートメントが実行された直後に実行を停止しました。値は次のとおりです。

(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) 

ステータスは、暗号化にエラーがなかったことを示す nil です。すべての値は期待どおりのように見えますが、initWithData は失敗します。操作の iPhone ビューは次のとおりです。

暗号化ボタンを押したときのアプリ画面

ここで initWithData が失敗するのはなぜですか?

4

1 に答える 1

6

ドキュメントにあるように、initWithData:encoding:渡されたデータがエンコーディングに対して有効なデータでない場合、nil が返されることがあります。一部のエンコーディングとは異なり、任意のデータを取得して UTF8 データであると偽ることはできません。UTF8 仕様に準拠する必要があります。

NSDataencryptedDataオブジェクトには一見ランダムなデータが含まれます - 有効な utf8 データであるinitWithData:encoding:可能性は非常に低いため、失敗する可能性が非常に高くなります。

テキスト ボックスに貼り付けられるものを探しているだけの場合は、暗号化されたデータを base64 でエンコードしてみてください。

于 2012-01-11T20:01:15.003 に答える