关键的是下面两个操作的结果,可以看到我们对明文做的基本算术操作改变了密文底层代表的明文。很优雅的操作,不是吗?
第7部分:优化加密过程引入: 我们再次审视一下解密的公式,如果密钥S为单位矩阵,那么密文c就只是重新加权后的明文混入一定的噪声而已,只要具有一定量的样本就可以发现。如果这段文字你不理解的话,你需要搜索一下“单位矩阵”相关的知识再回来阅读,否则下面的内容理解起来会很吃力。
上面的例子告诉了我们加密发生的过程。这项技术的发明者并没有同时确定一对独立的“公钥”和”私钥“,而是提出了“密钥转换”技术,借助这一技术可以将私钥S转换为S'。更具体地说,这种密钥转换技术生成了可以将未加密的数据(单位矩阵作为密钥)转换为加密后的数据(随机生成的,难以被猜到的密钥)的矩阵M,M就是我们的公钥!
上面一段包含的信息很多,我们再梳理一遍:
这里发生了什么...根据上面给定的两个公式,如果密钥是单位矩阵,则信息未加密。
根据上面给定的两个公式,如果密钥是一个随机矩阵,则生成的信息是加密的。
我们可以创建一个矩阵M,将密钥从一种形式更改为另一种形式。
当矩阵M从单位矩阵转换为随机矩阵密钥时,它通过扩展完成了信息的单向加密。
因为M扮演着“单向加密”的角色,所以我们称之为“公钥”,并且可以像公钥一样分发它,因为它并不能解密代码。
到此我们不做更深的讲解,下面我们看一下这个过程如何在Python中完成:
import numpy as np def generate_key(w,m,n): S = (np.random.rand(m,n) * w / (2 ** 16)) # proving max(S) < w return S def encrypt(x,S,m,n,w): assert len(x) == len(S) e = (np.random.rand(m)) # proving max(e) < w / 2 c = np.linalg.inv(S).dot((w * x) + e) return c def decrypt(c,S,w): return (S.dot(c) / w).astype('int') def get_c_star(c,m,l): c_star = np.zeros(l * m,dtype='int') for i in range(m): b = np.array(list(np.binary_repr(np.abs(c[i]))),dtype='int') if(c[i] < 0): b *= -1 c_star[(i * l) + (l-len(b)): (i+1) * l] += b return c_star def switch_key(c,S,m,n,T): l = int(np.ceil(np.log2(np.max(np.abs(c))))) c_star = get_c_star(c,m,l) S_star = get_S_star(S,m,n,l) n_prime = n + 1 S_prime = np.concatenate((np.eye(m),T.T),0).T A = (np.random.rand(n_prime - m, n*l) * 10).astype('int') E = (1 * np.random.rand(S_star.shape[0],S_star.shape[1])).astype('int') M = np.concatenate(((S_star - T.dot(A) + E),A),0) c_prime = M.dot(c_star) return c_prime,S_prime def get_S_star(S,m,n,l): S_star = list() for i in range(l): S_star.append(S*2**(l-i-1)) S_star = np.array(S_star).transpose(1,2,0).reshape(m,n*l) return S_star def get_T(n): n_prime = n + 1 T = (10 * np.random.rand(n,n_prime - n)).astype('int') return T def encrypt_via_switch(x,w,m,n,T): c,S = switch_key(x*w,np.eye(m),m,n,T) return c,S x = np.array([0,1,2,5]) m = len(x) n = m w = 16 S = generate_key(w,m,n)这种方法主要是让密钥S大多数情况下为单位矩阵,然后再用一个随机向量T和它结合在一起。虽然说T拥有了密钥所有的必要信息,但是我们还需要创建一个与S行列相同的矩阵来完成这个工作。
第8部分:建立异或神经网络现在我们已经知道了如何对信息进行加密和解密(并实现了基本的加法和乘法),是时候扩展剩余的操作来实现一个简单的XOR神经网络了。虽然从技术上来说神经网络只是一系列简单操作的集合,但为了方便我们需要将一些常用的组合操作封装为函数。下面我会描述我们需要的操作以及我们实现这些操作使用的一些高级技巧,然后会列出相关的代码实现。如果想了解更多细节可以参阅Angel Yu, Wai Lok Lai, James Payor的研究。