1, des加密常用两个库,pyDes,超慢,测试下来太费时间,放弃。另一个,
from Crypto.Cipher import DES, 速度超快,建议使用这个,安装方法也简单,pip install pycryptodome。
2,图像数据获取:
with open(os.path.join(dir,path),'rb') as f: bimg=f.read()
3,解密:
cipher2 = DES.new(b'8位加密数据', DES.MODE_CBC, b'8位初始化向量')#DES.new(DES_CODE.encode('utf-8'), DES.MODE_OFB,DES_CODE.encode('utf-8')) outimg = cipher2.decrypt(bimg)
4,转图:
img_array=np.frombuffer(outimg,dtype=np.uint8) newW= (w+3)//4*4 img=img_array[:h*newW].reshape([h,newW]) starttime = time.clock() cv2.imwrite('11.jpg',img[:,:w])#这里注意 虽然是 hw的输入,但是内存中是 h* int(w+3/4)*4的存放数据,而最后又多出必须是8的倍数,然后w不是4的倍数需转回去,所以利用了切片-》reshap-》再切片 print('time is: '+str(time.clock()-starttime))
5,问题(注意本题目中我的biBitCount=8),问题1,出现每次加密的原始数据是 h*w 后,如w是8的倍数,那么加密完成后 h*w+8,查询资料说是padding问题,即总位数不是8位的8位补齐,是8位的再加个8位,我测了下,新增的8位解密后是8个8(测试发现解密的位数会补充8的倍数,其中多补充了几位即为数字几,如上补8位 每位是8,若补4位,则每位是4).问题2,出现每次加密的原始数据是 h*w 后,如w不是8的倍数,那么加密完成后是:h*(int((8*w+31)/32))*32/8+x,或者 h*(w+3)//4*4+x一样不是8的倍数补齐8,是8的倍数+8。(好好理解:Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充) 注意 整除python用法,当用c++ 等简单/取整即可,但是对于python //表示取小的,注意负数的情况,4//3=1,-4//3=-2 注意不是-1,切记!!!另外int(0.9)=0,int(-0.9)=0,python中强制转化是向0进发的。问题3,为什么file open后利用 f.read()和f.readinto()不一样,因为f.read获取的是object类型,而bytearray是不行的,。获取大小的方法,1,len(f.read()) 2,os.path.getsize(filename)