即使我正在读取前16个字节,密文长度也不正确

时间:2017-11-12 06:01:39

标签: python-3.x encryption project

有些人可以帮助我,我试过谷歌搜索这个错误,但无法理解为什么它被提出。你能指出我的代码中的问题吗?我对加密这是一个相当新的问题,这是我第一次尝试使用它。

  

session_key = cipher_rsa.decrypt(enc_session_key)     ,ValueError(“长度不正确的密文”。),    ValueError:长度不正确的密文。

加密代码

from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.Random import get_random_bytes
random_generator = Random.new().read
print (random_generator,"HI")
key = RSA.generate(1024, random_generator)
print(key) 
code = 'totalyundetectable' #******************important ****************
encrypted_key = key.exportKey(format='PEM', passphrase=code, pkcs=8,
                          protection="scryptAndAES128-CBC")
with open('C:/Users/Arnav/Documents/Project/my_private_key.bin', 'wb') as f:
    f.write(encrypted_key)
with open('C:/Users/Arnav/Documents/Project/my_rsa_public.pem', 'wb') as f:
    f.write(key.publickey().exportKey())
with open('C:/Users/Arnav/Documents/Project/encrypted_data.bin', 'wb') as out_file:
recipient_key = RSA.import_key(
    open('C:/Users/Arnav/Documents/Project/my_rsa_public.pem').read())
session_key = get_random_bytes(16)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
out_file.write(cipher_rsa.encrypt(session_key))

cipher_aes = AES.new(session_key, AES.MODE_EAX)
data = b'blah blah bl'
ciphertext, tag = cipher_aes.encrypt_and_digest(data)

out_file.write(cipher_aes.nonce)
out_file.write(tag)
out_file.write(ciphertext)
code = 'totalyundetectable'

解密代码

    with open('C:/Users/Arnav/Documents/Project/encrypted_data.bin', 'rb') as fobj:
    private_key = RSA.import_key(
        open('C:/Users/Arnav/Documents/Project/my_private_key.bin','rb').read(),
        passphrase=code)

    enc_session_key, nonce, tag, ciphertext = [fobj.read(x)
                                               for x in (private_key.size_in_bytes(),
                                                         16, 16, -1)]

    cipher_rsa = PKCS1_OAEP.new(private_key)
    session_key = cipher_rsa.decrypt(enc_session_key)

    cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
    data = cipher_aes.decrypt_and_verify(ciphertext, tag)

print(data)

1 个答案:

答案 0 :(得分:0)

对于您来说,这似乎是错误的white spaces/tabs。因为如果我这样写:

List<ResultDoubleList> results = new List<ResultDoubleList>();

result(1):
Books
    How to Do This Double List  105
Readers
    Kyle    29
    Bob     34

result(2):
Books
    Gone With Jon Skeet     192
    Why Is This So Hard?    56
Readers
    Kyle    29
    James   45
    Brian   15

result(3):
Books
    Impostor Syndrome   454
    Self Doubt and You  999
Readers
    Kyle    29

我得到结果:

from Crypto.PublicKey import RSA
from Crypto import Random
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.Random import get_random_bytes

random_generator = Random.new().read
print (random_generator,"HI")
key = RSA.generate(1024, random_generator)
print(key)

code = 'totalyundetectable' #******************important ****************
encrypted_key = key.exportKey(format='PEM', passphrase=code, pkcs=8,
                          protection="scryptAndAES128-CBC")

with open('my_private_key.bin', 'wb') as f:
    f.write(encrypted_key)
with open('my_rsa_public.pem', 'wb') as f:
    f.write(key.publickey().exportKey())
with open('encrypted_data.bin', 'wb') as out_file:
    recipient_key = RSA.import_key(
    open('my_rsa_public.pem').read())
    session_key = get_random_bytes(16)
    cipher_rsa = PKCS1_OAEP.new(recipient_key)
    out_file.write(cipher_rsa.encrypt(session_key))

    cipher_aes = AES.new(session_key, AES.MODE_EAX)
    data = b'blah blah bl'
    ciphertext, tag = cipher_aes.encrypt_and_digest(data)

    out_file.write(cipher_aes.nonce)
    out_file.write(tag)
    out_file.write(ciphertext)
code = 'totalyundetectable'

with open('encrypted_data.bin', 'rb') as fobj:
    private_key = RSA.import_key(
        open('my_private_key.bin','rb').read(),
        passphrase=code)

    enc_session_key, nonce, tag, ciphertext = [fobj.read(x)
                                               for x in (private_key.size_in_bytes(),
                                                         16, 16, -1)]

    cipher_rsa = PKCS1_OAEP.new(private_key)
    session_key = cipher_rsa.decrypt(enc_session_key)

    cipher_aes = AES.new(session_key, AES.MODE_EAX, nonce)
    data = cipher_aes.decrypt_and_verify(ciphertext, tag)

print(data)

另外,请注意,如果您使用的代码结构中没有with statement,则需要最后关闭文件。

例如在这种情况下将是错误<bound method _UrandomRNG.read of <Crypto.Random._UrandomRNG object at 0x000001696F4B8700>> HI Private RSA key at 0x1696FB5CE20 b'blah blah bl'

ValueError: Ciphertext with incorrect length

要解决此问题,您需要编写如下内容:

#...

out_file = open("encrypted_data.bin", "wb")
recipient_key = RSA.import_key(
    open('my_rsa_public.pem').read())
session_key = get_random_bytes(16)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
out_file.write(cipher_rsa.encrypt(session_key))

cipher_aes = AES.new(session_key, AES.MODE_EAX)
data = b'blah blah bl'
ciphertext, tag = cipher_aes.encrypt_and_digest(data)

out_file.write(cipher_aes.nonce)
out_file.write(tag)
out_file.write(ciphertext)

#...

或者,您可以执行以下操作:

#...

out_file = open("encrypted_data.bin", "wb")
recipient_key = RSA.import_key(
    open('my_rsa_public.pem').read())
session_key = get_random_bytes(16)
cipher_rsa = PKCS1_OAEP.new(recipient_key)
out_file.write(cipher_rsa.encrypt(session_key))

cipher_aes = AES.new(session_key, AES.MODE_EAX)
data = b'blah blah bl'
ciphertext, tag = cipher_aes.encrypt_and_digest(data)

out_file.write(cipher_aes.nonce)
out_file.write(tag)
out_file.write(ciphertext)

out_file.close() # important to add at the end

#...