代码之家  ›  专栏  ›  技术社区  ›  betontalpfa

如何在python 3中对大数据进行RSA编码

  •  0
  • betontalpfa  · 技术社区  · 7 年前

    我尝试用python3加密数据。x使用pycrypto库。它适用于短数据,但不适用于长数组。如何加密长数据?我应该写一个包装器来分割数据小块吗?或者还有其他可以处理长数据的加密库吗?

    from Crypto.PublicKey import RSA
    from Crypto import Random
    
    random_generator = Random.new().read
    key = RSA.generate(1024, random_generator)
    publickey = key.publickey() 
    
    """
    Shorter (128 bytes)
    """
    msg = b'abcd'*32
    print(msg)          # b'abcdabcdabcd...
    enc=publickey.encrypt(msg, 32)
    print(enc)          # Depends on key. Ex.: (b"hd\n\xbb\xe4\x8b...
    dec=key.decrypt(enc)
    print(dec)          # b'abcdabcdabcdabcda...
    
    if msg==dec:        # TRUE
        print('TRUE')
    else:
        print('FALSE')
    
    """
    LONGER (132 bytes)
    """
    msg = b'abcd'*33
    print(msg)          # b'abcdabcdabcd...
    enc=publickey.encrypt(msg, 32)
    print(enc)          # Depends on key. Ex.: (b'\xa2J1;\xd4`\xc5i\x...   
    dec=key.decrypt(enc)
    print(dec)          # Depends on key. Ex.: b'|*\xb85\\B\\r2\xea\...   
    
    if msg==dec:        # FALSE
        print('TRUE')
    else:
        print('FALSE')
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   betontalpfa    7 年前

    这不是原始问题的确切答案,但这解决了我的问题: 基于 https://security.stackexchange.com/a/10953

    因此,不建议使用RSA加密大型数据/文件。改用AES:

    from Crypto.Cipher import AES
    obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
    message = "The answer is no"*32
    ciphertext = obj.encrypt(message)
    print(ciphertext)
    # '\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
    obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
    print(obj2.decrypt(ciphertext))
    # 'The answer is no'