2012-02-22 27 views
0

私はOpenSSLのCMSライブラリを使ってテキスト(単なる文字列)を暗号化しています。私は、CMSの暗号化方式を実装していると私は(同じ証明書と入力文字列で)C++プロジェクトでこれを呼び出すときには、次の出力を生成します。OpenSSL CMS C++とObjective-cで暗号化

MIME-Version: 1.0 
Content-Disposition: attachment; filename="smime.p7m" 
Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m" 
Content-Transfer-Encoding: base64 

MIAGCSqGSIb3DQEHA6CAMIACAQAxggG9MIIBuQIBADCBoDCBkjELMAkGA1UEBhMC 
QVQxDzANBgNVBAgMBlN0eXJpYTENMAsGA1UEBwwER3JhejEKMAgGA1UECgwBLzEK 
MAgGA1UECwwBLzEdMBsGA1UEAwwUQ2hyaXN0b2YgU3Ryb21iZXJnZXIxLDAqBgkq 
hkiG9w0BCQEWHXN0cm9tYmVyZ2VyQHN0dWRlbnQudHVncmF6LmF0AgkAmHFnJtIY 
YyAwDQYJKoZIhvcNAQEBBQAEggEACLskYA0ma3hBccwOamh14/b2XqRCmBakGxPM 
dQFMoiQy47UvGLQ4QmruOU1Mv530r3jglxVZd2DNX5fBPwHJ91ORU39BGns2BnWd 
E5z8yH5Kr1edjErj/EZRzJFU1Qyq6/uBn3W4X9+jNhuWWcPrxoQOoQhrE0vETnv4 
dZb5ic1iYLWOraSwnQmvOLgrh9iCJuq6n9EWF/YHJelETKQSO2RnPvbpesHLgZ48 
ngGkDH+FWU0QZV+LXmq8xpdpLWxMAeh07WIUz0sA1okYFMCk2uy5sg7ovyO804ae 
AbZlXz8aDeoMMGzOfNi2PxYxbwRwObBOj2cxU0qMQu49lgIhJjCABgkqhkiG9w0B 
BwEwFAYIKoZIhvcNAwcECNUojhuQn568oIAEGPkzqWrziObAHieBNpIKMGboxxY8 
oiTMIAQIToaGyI0IMGcAAAAAAAAAAAAA 

をしかし、私はObjective-Cのにコードをコピーするときそれはまったく同じコードだが、2つの異なる出力を生成

MIME-Version: 1.0 
Content-Disposition: attachment; filename="smime.p7m" 
Content-Type: application/pkcs7-mime; smime-type=enveloped-data; name="smime.p7m" 
Content-Transfer-Encoding: base64 

MIAGCSqGSIb3DQEHA6CAMIACAQAxggG4MIIBtAIBADCBoDCBkjELMAkGA1UEBhMC 
QVQxDzANBgNVBAgMBlN0eXJpYTENMAsGA1UEBwwER3JhejEKMAgGA1UECgwBLzEK 
MAgGA1UECwwBLzEdMBsGA1UEAwwUQ2hyaXN0b2YgU3Ryb21iZXJnZXIxLDAqBgkq 
hkiG9w0BCQEWHXN0cm9tYmVyZ2VyQHN0dWRlbnQudHVncmF6LmF0AgkAmHFnJtIY 
YyAwDQYJKoZIhvcNAQEBBQAEgfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwgAYJKoZIhvcNAQcBMBQG 
CCqGSIb3DQMHBAgAyfDfER+rUaCABBi7ammjNh3zr0CZDxRjalXcmxC5qIbWsoUE 
COCbSOGWOGcWAAAAAAAAAAAAAA== 

:(iOS5を用)プロジェクトは、私はもう解読することができない「間違った」出力を取得...これが出力されます。私にとって、2番目の出力は、ベース64のエンコーディングでは、 "AAAA"という馬が非常に奇妙に思えます。私はこれが証明書の一部でなければならないと思う。一番下には暗号化された入力文字列があり、証明書の始まりは同じですが、証明書の途中または終わりに変わってしまいます。

ここで何が問題になっているのでしょうか?次のように

答えて

0

OK ...問題はOpenSSLライブラリのバグでした。あるアーキテクチャー(すなわちi386)用にコンパイルし、それをx64環境で使用すると、CMS_encrypt()メソッドは前述の間違った出力を生成します。このバグは、アセンブラでのパフォーマンスの最適化によって発生します。詳細については

は、以下を参照してください。 http://www.openssl.org/support/faq.cgi =>12.なぜOpenBSDの-i386のビルドは "未実装セグメントタイプ" とデ・586.sに失敗するのですか?

no-asm属性のOpenSSLをコンパイルして解決しました。 ./Configure ... no-asm

iOSシミュレータで使用するライブラリにi386アーキテクチャが必要ですが、Mac OSXではx64が使用されているため、この問題が発生しました。単にno-asmでコンパイルすれば動作します。

1

S/MIMEエンコードは、一般的に動作します:

  1. を使用してランダムキー
  2. 暗号化あなたの平文を生成することをランダム鍵と対称暗号(例えばAESまたはトリプルDES)
  3. 暗号化受信者の公開鍵でランダムキーと非対称暗号(例えばRSA)

あなたはこれらの内部構造のより良いアイデアを得るために「のopenssl asn1parse」のようなコマンドを使用することができますメッセージ、例えば: blah.txtがあなたのS/MIMEの出力が含まれてい

$ openssl asn1parse < blah.txt 

、マイナスMIMEヘッダ(すなわち、 "MIAGCSq ..."で始まる)。あなたの良い出力から

... 
    196:d=6 hl=2 l= 9 prim: OBJECT   :rsaEncryption 
    207:d=6 hl=2 l= 0 prim: NULL    
    209:d=5 hl=4 l= 256 prim: OCTET STRING  [HEX DUMP]:08BB24600D266B784171CC0E6A6875E3F6F65EA4429816A41B13CC75014CA22432E3B52F18B438426AEE394D4CBF9DF4AF78E09715597760CD5F97C13F01C9F75391537F411A7B3606759D139CFCC87E4AAF579D8C4AE3FC4651CC9154D50CAAEBFB819F75B85FDFA3361B9659C3EBC6840EA1086B134BC44E7BF87596F989CD6260B58EADA4B09D09AF38B82B87D88226EABA9FD11617F60725E9444CA4123B64673EF6E97AC1CB819E3C9E01A40C7F85594D10655F8B5E6ABCC697692D6C4C01E874ED6214CF4B00D6891814C0A4DAECB9B20EE8BF23BCD3869E01B6655F3F1A0DEA0C306CCE7CD8B63F16316F047039B04E8F6731534A8C42EE3D96022126 
    469:d=3 hl=2 l=inf cons: SEQUENCE   
    471:d=4 hl=2 l= 9 prim: OBJECT   :pkcs7-data 
    482:d=4 hl=2 l= 20 cons: SEQUENCE   
    484:d=5 hl=2 l= 8 prim: OBJECT   :des-ede3-cbc 
    494:d=5 hl=2 l= 8 prim: OCTET STRING  [HEX DUMP]:D5288E1B909F9EBC 
    504:d=4 hl=2 l=inf cons: cont [ 0 ]   
    506:d=5 hl=2 l= 24 prim: OCTET STRING  [HEX DUMP]:F933A96AF388E6C01E278136920A3066E8C7163CA224CC20 
    532:d=5 hl=2 l= 8 prim: OCTET STRING  [HEX DUMP]:4E8686C88D083067 
... 

、そして:これをやって、あなたが得る

... 
    196:d=6 hl=2 l= 9 prim: OBJECT   :rsaEncryption 
    207:d=6 hl=2 l= 0 prim: NULL    
    209:d=5 hl=3 l= 252 prim: OCTET STRING  [HEX DUMP]:000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
    464:d=3 hl=2 l=inf cons: SEQUENCE   
    466:d=4 hl=2 l= 9 prim: OBJECT   :pkcs7-data 
    477:d=4 hl=2 l= 20 cons: SEQUENCE   
    479:d=5 hl=2 l= 8 prim: OBJECT   :des-ede3-cbc 
    489:d=5 hl=2 l= 8 prim: OCTET STRING  [HEX DUMP]:00C9F0DF111FAB51 
    499:d=4 hl=2 l=inf cons: cont [ 0 ]   
    501:d=5 hl=2 l= 24 prim: OCTET STRING  [HEX DUMP]:BB6A69A3361DF3AF40990F14636A55DC9B10B9A886D6B285 
    527:d=5 hl=2 l= 8 prim: OCTET STRING  [HEX DUMP]:E09B48E196386716 
... 

あなたの悪い出力に。つまり、あなたの出力にあるすべてのAがRSAで暗号化された鍵であると考えられるので、RSA暗号化は何とか失敗しています。

あなたのコードについて詳しく知りませんが、間違っていることを正確に言うのは難しいですが、暗闇の中でのショットとして、 OpenSSL_add_all_algorithms()(または同じ目的を達成しているもの)を呼び出すことを思い出したと思いますが、おそらく既にそうしています。そうでないと、コードはiOSだけでなくどこでも失敗する可能性があります。 ..

関連する問題