OpenSSL CMS шифруется на C ++ и Objective-c - PullRequest
0 голосов
/ 22 февраля 2012

Я шифрую текст (просто строку), используя библиотеку CMS OpenSSL. Я реализовал метод шифрования cms, и когда я вызываю его в проекте 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

Но когда я копирую код в проект target-c (для iOS5), я получаю «неправильный» вывод, который больше не могу расшифровать ... Это вывод:

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==

Это точно такой же код, но выдает два разных вывода. Мне второй вывод кажется очень странным из-за гривы "AAAA" в кодировке base64. Я думаю, это должно быть частью сертификата. Внизу находится зашифрованная строка ввода, начало сертификата совпадает, но в середине или конце сертификата оно странным образом меняется.

У кого-нибудь есть предложения, что здесь происходит не так?

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Кодировка S / MIME обычно работает следующим образом:

  1. Генерация случайного ключа
  2. Зашифруйте ваш открытый текст, используя этот случайный ключ и симметричный шифр (например, AES или triple-DES)
  3. Зашифруйте случайный ключ с помощью открытого ключа получателя и асимметричного шифра (например, RSA)

Вы можете использовать команду типа "openssl asn1parse", чтобы лучше понять внутреннюю структуру этих сообщений, например ::

$ openssl asn1parse < blah.txt

Где blah.txt содержит выходные данные S / MIME, за исключением заголовков 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
...

на вашем плохом выходе. Таким образом, это говорит о том, что все эти буквы «А» в вашем выводе должны быть ключами, зашифрованными RSA, поэтому шифрование RSA каким-то образом дает сбой.

Однако, не зная больше о вашем коде, трудно сказать точно, что происходит не так. Как выстрел в темноте, я бы сказал, что вы не забыли вызвать OpenSSL_add_all_algorithms () (или что-то для достижения той же цели), но вы, вероятно, уже сделали, в противном случае ваш код, скорее всего, не будет работать везде, не только на iOS ...

0 голосов
/ 23 февраля 2012

Хорошо ... проблема заключалась в ошибке в lib OpenSSL. При компиляции для определенной архитектуры (т.е. i386) и ее использовании в среде x64 метод CMS_encrypt() дает вышеупомянутый неправильный вывод. Эта ошибка является результатом некоторых оптимизаций производительности в ассемблере.

Для получения дополнительной информации см .: http://www.openssl.org/support/faq.cgi => 12. Почему сборка OpenBSD-i386 завершается неудачно на des-586.s с «Не реализованным типом сегмента»?

Я решил это путем компиляции OpenSSL с атрибутом no-asm. ./Configure ... no-asm

У меня была эта проблема, потому что библиотека, используемая для симулятора iOS, нуждается в архитектуре i386, но Mac OSX использует x64. Просто скомпилируйте его с no-asm, и он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...