ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-通过TCP套接字进行AES加密的文件传输;填充问题

2019-10-31 03:59:53  阅读:158  来源: 互联网

标签:sockets encryption tcp python


我正在尝试使用带有AES 256的加密TCP套接字进行文件传输.

>如果我传输的文件没有加密,则可以正常工作.
>如果我将小的命令(例如“ ipconfig”)发送到客户端或服务器,则加密工作正常.
>无论文件大小如何,我都会不断收到以下错误消息:

DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)
  File "/usr/lib/python2.6/base64.py", line 76, in b64decode
    raise TypeError(msg)
TypeError: Incorrect padding

我的编码和解码功能如下(hat变量是消息):

def AESENC(hat,typ):

    BLOCK_SIZE = 32
    PADDING = '{'
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
    EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
    DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

    secret = '01234567890123456789012345678912'
    IV = 'wir&/>H54mgd9a";'

    cipher = AES.new(secret,AES.MODE_CFB,IV)

    if typ == 0:
        encoded = EncodeAES(cipher, hat)
        return encoded
    else:
        decoded = DecodeAES(cipher, hat)
        return decoded

客户端

if os.path.exists(df):
    print ' found the file '
    f = open(df, 'rb')
    packet = f.read(1024)
    while packet != '':
        s.send(AESENC(packet,0)) 
        s.send(   AESENC('123XXX',0)  ) 
    s.send('123XXX')
    f.close()

服务器端

f = open('/root/Desktop/Transfer.mp3','wb')
while True:
    bits =  AESENC ( conn.recv(1024) , 1 )
    while (bits):
        f.write(bits)
        bits =  AESENC ( conn.recv(1024) , 1 )
        if bits.endswith('123XXX'):
            print '[+] Transfer completed '
            break

    f.close()
    break
return

有人知道如何解决此问题吗?

解决方法:

对于您对示例代码的误解,我们深表歉意,并感谢您添加服务器和客户端调用!

请注意,您收到的错误消息与加密无关.您可以阅读base64.py库的相关部分:错误消息表明base64数据无效.特别是,最后没有正确填充.

有了附加的呼叫站点信息,我相信问题是您正在加密,然后分别对客户端上数据的每个1024字节块进行编码.然后,在服务器上,您正在从网络读取1024个字节并尝试对其进行解码.但是,base64编码将增加原始数据的长度,因此您将仅读取编码形式的前1024个字节,这将是被截断的base64消息(因此未正确填充).

至于如何解决,base64消息需要全部解码为一条.因此,您要么需要计算要从网络读取多少数据即可获得完整的编码块(这种计算可以可靠地执行,但最后一个数据包可能很短,因为base64的长度始终为(length 2)/ 3 * 4 ),立即对整个数据流进行编码(如果要处理任意大小的文件,可能会由于使用内存而出现问题),或者定义您的网络协议,以便服务器可以判断出可以看到一个完整的块用base64解码.

标签:sockets,encryption,tcp,python
来源: https://codeday.me/bug/20191031/1972885.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有