#二维明文图像转成三维比特矩阵,先设为h*w*8dim #三维矩阵的维度 r1=h r2=w r3=8*dim bin_pixels=np.zeros((r1,r2,r3)) for i in range(r1): for j in range(r2): bin_pixels[i][j]=np.append(np.append(pixel2bit(im[i][j][0]),pixel2bit(im[i][j][1])),pixel2bit(im[i][j][2])) #Chen系统控制参数 a=35 b=3 c=28 #初始条件 x0=key[0] y0=key[1] z0=key[2] #迭代次数,舍去前500个暂态值 T=500+r1+r2+r3 xi,yi,zi=Chen(x0,y0,z0,a,b,c,T) #得到大小分别为r1,r2,r3的三个整数序列 qxi=[] qyi=[] qzi=[] #与65536取模,而不是256是为了扩大序列值空间,兼顾效率的同时增加随机性 for i in xi[-r1:]: qxi.append(int(i*(10**9))%65536) for i in yi[-r2:]: qyi.append(int(i*(10**9))%65536) for i in zi[-r3:]: qzi.append(int(i*(10**9))%65536) X=np.arange(r1) Y=np.arange(r2) Z=np.arange(r3) #根据qxi排序 #打包 dic=list(zip(qxi,X)) dic.sort(key=lambda x:x[0]) #得到排序后的像素列表 X=list(list(zip(*dic))[1]) #根据qyi排序 dic=list(zip(qyi,Y)) dic.sort(key=lambda x:x[0]) #得到排序后的像素列表 Y=list(list(zip(*dic))[1]) #根据qzi排序 dic=list(zip(qzi,Z)) dic.sort(key=lambda x:x[0]) #得到排序后的像素列表 Z=list(list(zip(*dic))[1]) ax=int(xi[200]*(10**9))%64 ay=int(yi[200]*(10**9))%64 az=int(zi[200]*(10**9))%64 bx=int(xi[201]*(10**9))%64 by=int(yi[201]*(10**9))%64 bz=int(zi[201]*(10**9))%64 ax=ay=az=bx=by=bz=1 cat=np.zeros((3,3)) cat=np.array([[1+az*az*by,az,ay+ax*az+ax*ay*az*by],[bz+az*by+ax*az*by*bz,az*bz+1,ay*az+az*ay*by*bz+ax*az*bz+az*ay*by+ax],[ax*bx*by+by,bx,ax*ay*bx*by+ax*bx+ay*by+1]]) # pixels=np.zeros((r1,r2,r3)) print(cat) #3D Cat是满射吗,二维Arnold是满射,如果不是就会出问题?? pixels=np.array(bin_pixels) for i in range(r1): for j in range(r2): for k in range(r3): posx=(X[i]*(1+az*az*by)+Y[j]*az+Z[k]*(ay+ax*az+ax*ay*az*by))%r1 posy=(X[i]*(bz+az*by+ax*az*by*bz)+Y[j]*(az*bz+1)+Z[k]*(ay*az+az*ay*by*bz+ax*az*bz+az*ay*by+ax))%r2 posz=(X[i]*(ax*bx*by+by)+Y[j]*bx+Z[k]*(ax*ay*bx*by+ax*bx+ay*by+1))%r3
pixels[i][j][k]=bin_pixels[posx][posy][posz]
#三维比特矩阵转三维RGB像素值 for i in range(r1): for j in range(r2): B=bit2pixel(pixels[i][j][:8]) G=bit2pixel(pixels[i][j][8:16]) R=bit2pixel(pixels[i][j][16:]) im[i][j]=np.array([B,G,R]) #扁平化为一维 pm=im.flatten(order='C')
#扩散阶段 #逻辑映射初始条件 keyd1=key[3] keyd2=key[4] #tmp2参数 keyd3=key[5] tmp2=int(3.99999*keyd3*(1-keyd3)*1000)%256 rs1=Logistic(keyd1,w*h*3+2000) rs2=Logistic(keyd2,w*h*3+2000) rdm1=np.zeros(w*h*3,dtype=np.uint8) rdm2=np.zeros(w*h*3,dtype=np.uint8) for i in range(w*h*3): rdm1[i]=int(rs1[2000+i]*(10**9))%256 rdm2[i]=int(rs2[2000+i]*(10**9))%256
for i in range(w*h*3): tmp1=rdm1[tmp2] pm[i]=pm[i]^rdm2[tmp1] tmp2=pm[i]
#逆扩散阶段 #逻辑映射初始条件 keyd1=key[3] keyd2=key[4] #tmp2参数 keyd3=key[5] tmp2=int(3.99999*keyd3*(1-keyd3)*1000)%256 rs1=Logistic(keyd1,w*h*3+2000) rs2=Logistic(keyd2,w*h*3+2000) rdm1=np.zeros(w*h*3,dtype=np.uint8) rdm2=np.zeros(w*h*3,dtype=np.uint8) for i in range(w*h*3): rdm1[i]=int(rs1[2000+i]*(10**9))%256 rdm2[i]=int(rs2[2000+i]*(10**9))%256
for i in range(w*h*3): tmp1=rdm1[tmp2] tmp2=pm[i] pm[i]=pm[i]^rdm2[tmp1] print(pm[:20]) #重新转成三维 im=pm.reshape((h,w,dim),order='C')
print(im[1][:10])
#三维像素矩阵转成三维比特矩阵 pixels=np.zeros((r1,r2,r3)) for i in range(r1): for j in range(r2): pixels[i][j]=np.append(np.append(pixel2bit(im[i][j][0]),pixel2bit(im[i][j][1])),pixel2bit(im[i][j][2]))
xi,yi,zi=Chen(x0,y0,z0,a,b,c,T) #得到大小分别为r1,r2,r3的三个整数序列 qxi=[] qyi=[] qzi=[] #与65536取模,而不是256是为了扩大序列值空间,兼顾效率的同时增加随机性 for i in xi[-r1:]: qxi.append(int(i*(10**9))%65536) for i in yi[-r2:]: qyi.append(int(i*(10**9))%65536) for i in zi[-r3:]: qzi.append(int(i*(10**9))%65536) X=np.arange(r1) Y=np.arange(r2) Z=np.arange(r3) #根据qxi排序 #打包 dic=list(zip(qxi,X)) dic.sort(key=lambda x:x[0]) #得到排序后的像素列表 X=list(list(zip(*dic))[1]) #根据qyi排序 dic=list(zip(qyi,Y)) dic.sort(key=lambda x:x[0]) #得到排序后的像素列表 Y=list(list(zip(*dic))[1]) #根据qzi排序 dic=list(zip(qzi,Z)) dic.sort(key=lambda x:x[0]) #得到排序后的像素列表 Z=list(list(zip(*dic))[1])
#逆3D cat映射,这里两种解法,要么求3D cat逆矩阵,要么倒用映射规则,cat逆矩阵难求,采用第二种 ax=int(xi[200]*(10**9))%64 ay=int(yi[200]*(10**9))%64 az=int(zi[200]*(10**9))%64 bx=int(xi[201]*(10**9))%64 by=int(yi[201]*(10**9))%64 bz=int(zi[201]*(10**9))%64 ax=ay=az=bx=by=bz=1 # bin_pixels=np.zeros((r1,r2,r3)) bin_pixels=np.array(pixels) for i in range(r1): for j in range(r2): for k in range(r3): posx=(X[i]*(1+az*az*by)+Y[j]*az+Z[k]*(ay+ax*az+ax*ay*az*by))%r1 posy=(X[i]*(bz+az*by+ax*az*by*bz)+Y[j]*(az*bz+1)+Z[k]*(ay*az+az*ay*by*bz+ax*az*bz+az*ay*by+ax))%r2 posz=(X[i]*(ax*bx*by+by)+Y[j]*bx+Z[k]*(ax*ay*bx*by+ax*bx+ay*by+1))%r3 bin_pixels[posx][posy][posz]=pixels[i][j][k]
#三维比特矩阵转三维RGB像素值 for i in range(r1): for j in range(r2): B=bit2pixel(bin_pixels[i][j][:8]) G=bit2pixel(bin_pixels[i][j][8:16]) R=bit2pixel(bin_pixels[i][j][16:]) im[i][j]=np.array([B,G,R]) print(im[0][:5])