2

iPadでPGPファイルの復号化を実装しようとしています。テスト用の.txtファイルをいくつか設定し、PGPデスクトップを介して暗号化しました。

SecPKCS12Importを使用して、ドキュメントの暗号化に使用される証明書の秘密鍵をインポートし、次に、結果のSecIdentityRefからSecIdentityCopyPrivateKey()をインポートしました。

証明書の公開鍵と秘密鍵を使用して、Objective Cで単純な文字列の暗号化と復号化をテストすると、完全に機能します。

実際のPGP復号化を試しているので、少し困惑しています... .pgpファイルからテキストを読み取ると、次のようになります。

-----BEGIN PGP MESSAGE-----
Version: 10.1.1.10

qANQR1DBwEwDraQm2Kxa5GkBB/4yLebeLk10C2DVvHpQL20E0DThhgQlTasXo+YJ
pLp5Ig2hHu4Xx0m74D3vfyWpA2XQA02TMAHO9lhNfkE234c/ds05D1UyQkJEoqW+
joEcbRT5rlGN3qrMf1FXv8/01EHH0dgeD6mAkkDeDEorIirYHCF6+QVkedaphZLs
c63GmcikzkWZT/vv20ICL3Ys0DaC3P9zu0T1GtjkmQ062kaTab/VBJnQrsY/y1JU
ypmbW9bbFeZMcAqXHMqpjw49K5UluIJaDbRNAjIvHTFLNuOYWVJM6FcMs5p6xqvZ
ltizeKAjr1B1h4DvbQaqdO6/OAb+dGr7fJoIHEszDsJbW1cc0lUBitrxKHrPGovF
1uEW+3glA3SopveWB4GkKzcYlbqT5y1p/gQNwY8yuZr/6iF1hyF9mx/hU/+xjOMB
og3sGX4npcQegsAMw2y+zz9kJ9a6jlteNufi
=d2Fq
-----END PGP MESSAGE-----

ファイル内のデータから、PGPがファイルの暗号化に使用したランダムなワンタイムキーを取得する必要があることを知っています。そのためには、秘密鍵でSecKeyDecryptを使用して、1回限りのAES鍵を取得する必要があることを知っています。そのキーを取得したら、残りのデータを復号化できます。

私が問題を抱えているのは、データのどの部分をSecKeyDecryptにフィードするかです。PGPファイルの設定はどのようになっていますか?最初の128文字はAESキーですか?私の理解が間違っていない限り、私はそれをデータとは別に取り出す必要があります。

たとえば、最初の128文字をSecKeyDecrypt関数を介してvoidとして実行すると、(BEGIN PGP MESSAGE行を削除した後)

size_t dataLength = [theKey length]; 
size_t outputLength = MAX(128, SecKeyGetBlockSize(privateKeyRef));
void *outputBuf = malloc(outputLength);  

OSStatus err;

err = SecKeyDecrypt(privateKeyRef, kSecPaddingNone,//PKCS1, 
                                  (uint8_t *)theKey, dataLength,
                                 outputBuf, &outputLength);
if (err) {
    NSLog(@"something went wrong...err = %ld", err);
}

私はこれを手に入れます:

MRªh6∞bJ˘e£t*˝ã=ŒA¢Òt'ŸY±éÿAÃîâGÎfi≠$b≈tâç`yxk=uHªqu-、–dïn^™È\›5±tb。‡€Kñ⁄≤sΩw–ïʃkafS ˘À*Æô竡rAyv)?] wOrµKz ^ªq“à∑öΓı* r <+ l˝Äo∑› g≠¶/÷eÔ&€PÒRåêM¶Ñ| Q $á6În^võ¬∏・h(ƒß• R≤(flò(*•Aa

これがどのエンコーディングであるかはわかりませんが、outputBufから文字列に取得しようとしても100%機能することはありません。どのエンコーディングを渡しても変更されるようです。最初にNSDataに渡すと、元の文字列を取り戻すことができます。

NSData *keyData = [NSData dataWithBytesNoCopy:outputBuf length:outputLength];
NSString *keyFromData = [[NSString alloc] initWithBytes:[keyData bytes] length:[keyData length] encoding:NSASCIIStringEncoding]; 

次に、そのキーをAES256DecryptWithKeyクラスに渡して、最初の128文字の後にPGPファイルの残りのデータを提供しようとします。

NSData *cipherText = [[NSData alloc]initWithData:[[bodyPart objectAtIndex:1]   dataUsingEncoding:NSUTF8StringEncoding]];

NSData *plain = [[NSData alloc] initWithData:[cipherText AES256DecryptWithKey:keyFromData]];
NSLog(@"after decrypting = %@", [[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding]);

問題:

結果のデータ「plain」は<>、つまり空として出力されます。私の問題は、PGPファイルからキーを取得する方法さえ知らないと思うことです。

誰かが私にPGPファイルの設定を説明できますか?実際にデータから完全に分離されている場合、「キー」はどの部分ですか?いつも同じ長さ/同じ位置ですか?それが分離していない場合、私はそれをどのようにつかむことができるのかまったくわかりません。残りはうまくいくと思います。エラーやクラッシュが発生していません。AES復号化に渡す正しいキーやデータではありません。おそらく文字列エンコーディングエラーの組み合わせであり、AESキーと正しい組み合わせの適切な量を取得していない可能性があります。 。

ノート -

3つの異なるテキストファイルを作成し、それらをPGPプロセスで実行しました。それらを調べると、それらはすべて同じ24文字(qANQR1DBwEwDraQm2Kxa5GkB)で始まりました。これらの24を復号化に渡しても機能せず、使用するAESキーPGPがドキュメントごとに異なるという印象を受けました。私はそれを間違えましたか?

正しい方向への一歩をありがとう!

追加するために編集:

部分的に私の間違いに気づきました-128のAESは16ビットを必要とするので、どちらにしても128文字を使用して間違った量を取っています、愚かな間違い、私はこれをあまりにも長い間見ていたと思います...それを交換してしませんでした仕事。私が行う復号化は、'⁄Ĉ¢ï¡0M¶È2Cˆ¿©gUú¨6iîΩ`&<%Jœv£¯nRb∆:(–%'タイプの結果になります。これは、私が何か間違ったことをしたことを意味します。エンコーディングでさらに何かをする必要があります。

4

2 に答える 2

0

AES キーは確かに異なります。これはランダムに選択され、公開鍵システム (通常は RSA) で暗号化されます。公開鍵にはコストと制限があるため、大量に使用するのは魅力的ではありません。

BSD ライセンスに基づく C コードである NetPGP を調べてみるとよいでしょう。つまり、アプリに負担をかけたり、Apple を動揺させたりすることなく、NetPGP を組み込んだり変更したりできます。(もちろん、ソース コードや金銭の寄付はプロジェクトに感謝​​されます。私はそれらと提携していません。)

OpenPGP 標準の実装には多くの作業が必要です。実装が機能したとしても、安全でない可能性がある方法は無数にあります。

于 2012-06-08T23:40:39.017 に答える