即使有一个字符数据,PyCrypto密文长度也不正确

时间:2019-02-18 17:00:06

标签: python python-3.x encryption pycrypto pycryptodome

我想加密/解密.csv文件中包含的一组数据。 我使用以下代码生成RSA公钥/私钥:

import Crypto
from Crypto.PublicKey import RSA

key = RSA.generate(2048)

k = key.exportKey('PEM')
p = key.publickey().exportKey('PEM')

with open('private.pem', 'w') as kf:
    kf.write(k.decode())
    kf.close()

with open('public.pem', 'w') as pf:
    pf.write(p.decode())
    pf.close()

with open('private.pem','r') as fk:
    priv = fk.read()
    fk.close()

with open('public.pem','r') as fp:
    pub = fp.read()
    fp.close()

privat = RSA.importKey(priv)
public = RSA.importKey(pub)

if key == privat:
    print('Private key has been successfuly write')
if key.publickey() == public:
    print('Public key has been successfuly write')

然后我用此代码加密而没有任何问题:

import Crypto
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

with open('public.pem','r') as fp:
    pub = fp.read()
    fp.close()

public = RSA.importKey(pub)

#stockage du fichier dans une variable rep
fichier = open('test.csv', 'r')
rep = fichier.read()
fichier.close()

#eliminations des spaces
rep = rep.replace(' ', '')

#encodage pour type bytes
rep = rep.encode()

#decoupage en mot de 10 chars
rep = [rep[i:i+10] for i in range(0, len(rep), 10)]

cipher = PKCS1_OAEP.new(public)

fichier2 = open('encrypted.csv', 'a')
for i in rep:
    encrypted_line = cipher.encrypt(i)
    fichier2.write(str(encrypted_line))
    fichier2.write('\n')

fichier2.close()

我可以通过修改以下行来修改数据的分离方式:

  

rep = [rep [i:i + n] for i in range(0,len(rep),n)]

此行按n个字符分组分隔我的数据

这是我的代码来解密数据,它引发:

  

ValueError:密文长度不正确。

import Crypto
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

with open('private.pem','r') as fk:
    priv = fk.read()
    fk.close()

private = RSA.importKey(priv)

fichier = open('encrypted.csv', 'r')
rep = fichier.read().splitlines()
fichier.close()

cipher = PKCS1_OAEP.new(private)

fichier2 = open('decrypted.csv', 'a')
for i in rep:
    decrypted_line = cipher.decrypt(i)
    decrypted_line = decrypted_line.decode('utf-8')
    fichier2.write(str(encrypted_line))

fichier2.close()

我尝试对示例文件进行编码,并引发了此ValueError。然后,我尝试在Python解释器上直接使用仅包含一个char的文件。加密效果很好,但解密却出现了与上述相同的错误。

1 个答案:

答案 0 :(得分:1)

代码的主要问题是使用换行符分隔加密数据块。加密的数据可能已经包含换行符,因此尝试将加密的数据拆分为多行可能会产生部分数据块,这将提高解密时看到的$scope.openTutorial = function(ev){ $mdDialog.show({ controller: TutorialController, templateUrl: 'partials/tutorial.html', parent: angular.element(document.body), targetEvent: ev, clickOutsideToClose:true, fullscreen: $scope.customFullscreen }); }; function TutorialController($scope, $mdDialog, DashFactory) { $scope.hide = function() { $mdDialog.hide(); }; }

第二个问题是加密文件正在以文本模式打开。处理加密数据时,以二进制模式打开文件。加密的ValueError不太可能被解码为bytes,因此使用文本模式会导致编码或解码错误。

此版本的代码有效:

str

此代码不是在换行符上分割加密的数据,而是从文件中读取256字节的块,因为加密过程似乎为每个输入块生成256字节。我不是密码学家,所以可能并非总是如此。在这种情况下,最好一步一步加密(或解密)所有数据。