2012-05-31 2 views
3

Используя обнаруженный код на https://raw.github.com/usefulfor/usefulfor/master/security/JBoss.java, я thefollowing:Blowfish дешифрования в питона строки кодируется javax.crypto

bash-3.2$ java -cp . JBoss -e testpython 
-27038292d345798947e2852756afcf0a 
bash-3.2$ java -cp . JBoss -d -27038292d345798947e2852756afcf0a 
testpython 

Однако, я не могу за жизнь мне понять, как расшифровать string '27038292d345798947e2852756afcf0a', используя pycrypto в python. Я понимаю, что код Java использует Blowfish, а фраза «jaas - это способ» в качестве ключа для шифрования. Но я не могу понять, как это сделать в python. Следующие результаты в основном непечатаемого мусора:

import Crypto 
from Crypto.Cipher import Blowfish 
from base64 import b64encode, b64decode 

bs  = Blowfish.block_size 
key  = 'jaas is the way' 
plaintext = b'27038292d345798947e2852756afcf0a' 
iv  = '\0' * 8 

c1 = Blowfish.new(key, Blowfish.MODE_ECB) 
c2 = Blowfish.new(key, Blowfish.MODE_CBC, iv) 
c3 = Blowfish.new(key, Blowfish.MODE_CFB, iv) 
c4 = Blowfish.new(key, Blowfish.MODE_OFB, iv) 

msg1 = c1.decrypt(plaintext) 
msg2 = c2.decrypt(plaintext) 
msg3 = c3.decrypt(plaintext) 
msg4 = c4.decrypt(plaintext) 

print "msg1 = %s\n" % msg1 
print "msg2 = %s\n" % msg2 
print "msg3 = %s\n" % msg3 
print "msg4 = %s\n" % msg4 

Что мне не хватает?

спасибо.

+0

Добро пожаловать на ТАК! Убедитесь, что вы отметили ответ, принятый с помощью флажка рядом с ответом. – jterrace

ответ

5

Прежде всего, этот пример кода Java очень плохой. Он выводит зашифрованный текст как целое число, тогда как шифрованный текст должен оставаться двоичной строкой. Причина в том, что целое число может быть представлено в бесконечном числе двоичных кодировок. Например, номер один может быть «0x01» (1 байт), «0x0001» (2 байта) и т. Д. Когда вы имеете дело с криптографическими функциями, вы должны быть предельно точными с представлением.

Кроме того, в примере используются значения по умолчанию для API javax.crypto, которые не описаны нигде. Так что это действительно проб и ошибок.

Для решения проблемы вы должны знать how to convert negative integers to hex strings in Python. В этом случае вам не нужна шестнадцатеричная строка, а ее байтовое представление. Однако концепция та же. Я использую PyCrypto's long_to_bytes для преобразования положительного целого числа (произвольной длины) в байтовую строку.

from Crypto.Cipher import Blowfish 
from Crypto.Util.number import long_to_bytes 

def tobytestring(val, nbits): 
    """Convert an integer (val, even negative) to its byte string representation. 
    Parameter nbits is the length of the desired byte string (in bits). 
    """ 
    return long_to_bytes((val + (1 << nbits)) % (1 << nbits), nbits/8) 

key = b'jaas is the way' 
c1 = Blowfish.new(key, Blowfish.MODE_ECB) 

fromjava = b"-27038292d345798947e2852756afcf0a" 
# We don't know the real length of the ciphertext, assume it is 16 bytes 
ciphertext = tobytestring(int(fromjava, 16), 16*8) 
print c1.decrypt(ciphertext) 

Выход:

'testpython\x06\x06\x06\x06\x06\x06' 

Из этого вы видите, что javax.crypto также добавляет PKCS # 5 отступы, что вам нужно удалить самостоятельно. Но это тривиально.

Тем не менее, real Решение проблемы: лучше сделать Java-шифрование. Код Python будет значительно упрощен.

+0

+1 хорошая работа, выясняя это. Я потратил некоторое время, пытаясь понять, как преобразовать отрицательное шестнадцатеричное значение в тот же массив байтов, что и BigInteger. Согласился с тем, что код Java - это ужасный способ печати текста шифрования – jterrace

+0

@jterrace Если вы принимаете этот ответ, нажмите большой белый «V» слева. – SquareRootOfTwentyThree

+0

Я не OP :) (также, это галочка, а не V) – jterrace

0

Это помогает мне

private byte[] encrypt(String key, String plainText) throws GeneralSecurityException { 

    SecretKey secret_key = new SecretKeySpec(key.getBytes(), ALGORITM); 

    Cipher cipher = Cipher.getInstance(ALGORITM); 
    cipher.init(Cipher.ENCRYPT_MODE, secret_key); 

    return cipher.doFinal(plainText.getBytes()); 
} 

надеюсь, что это будет полезно для вас, более http://dexxtr.com/post/57145943236/blowfish-encrypt-and-decrypt-in-java-android

Смежные вопросы