RSA с Java на Python

Я пытаюсь зашифровать строку с Java на Python, используя библиотеку Bouncy Castle J2ME на стороне клиента и Python M2Crypto на другой.

Все довольно хорошо, я могу расшифровать это правильно, но проблема заключается в заполнении.

Библиотека M2Crypto дает мне (насколько я могу судить) только эти схемы заполнения: no_padding = 3 pkcs1_padding = 1 sslv23_padding = 2 pkcs1_oaep_padding = 4

В то время как надувной замок J2ME обеспечивает только: NoPadding OAEPWithAndPadding PKCS5Padding SSL3Padding

Таким образом, я могу использовать NoPadding между обоими, но тогда строки, которые генерируются после расшифровки, заполняются перемешанными символами.

Я бы очень хотел разобраться с дополнением, но я не знаю, как преобразовать между схемами заполнения / если это вообще возможно.

Пожалуйста, помогите мне разобраться, это меня убивает!


person Crowe T. Robot    schedule 24.11.2009    source источник


Ответы (2)


Я не знаком с Bouncy Castle, но думаю, вы каким-то образом используете RSAEngine, который реализует AsymmetricBlockCipher поэтому вы должны иметь возможность использовать PKCS1 или нет?

И, кажется, также есть OAEP поддержка, которая при правильных параметрах тоже должна работать.

person jitter    schedule 24.11.2009
comment
Наверное, я был. Я опубликовал это после нескольких часов возни в отчаянии, и о чудо, это было что-то довольно простое. Оказывается, если я использую строку RSA/ECB/PKCS1Padding с провайдером BC, ее может прочитать python с помощью PKCS1. Требуется ECB, иначе повсюду ненужные символы. Кроме того, мне нужно было убедиться, что ключ находится в формате DER, и прочитать его с помощью X509EncodedKeySpec, чтобы он мог быть прочитан. DER = PEM минус заголовок (----BEGIN...), и декодировано base64. - person Crowe T. Robot; 24.11.2009

Надувной замок обеспечивает набивку. Если вы хотите, например, создать RSA с дополнением PKCS1, вам нужно сделать это:

public static PKCS1Encoding create_rsa_public(RSAKeyParameters PublicKey){
    RSAEngine engine=new RSAEngine();
    PKCS1Encoding encrypto=new PKCS1Encoding(engine);
    encrypto.init(true,PublicKey);
    return encrypto;
}

Эта функция вернет вам механизм RSA с PKCS1Encoding.

person tdgs    schedule 21.01.2011