我正在Verilog的一个项目中,它将加密一个20位数字并使用XOR,NOT和NAND门将其解密。
加密,
XOR
xorEncDec
(XOR的预定义操作数)NOT
输入(也是1的comp)NAND
nandEncDec
(NAND的预定义操作数)我的解密器出了问题。数字以十六进制表示。这是我的程序的示例输出:
我现在用于解密的当前逻辑(有问题)是
NAND
2的nandEncDec
NOT
2的输入补偿XOR
2的xorEncDec
我觉得我已经接近答案了,因为每个解密阶段的输出似乎是负面表示。你能帮我解决我的解密算法吗?我不是真的在Verilog代码中寻找答案,即使是算法或正确的门也可以。
答案 0 :(得分:1)
NAND是一种难以置信的行动:
a b (a NAND b)
0 0 1
0 1 1
1 0 1
1 1 0
如果b
为0并且您知道(a NAND b)
的结果为1,则无法知道a
是0还是1.因此,您的加密算法存在缺陷,并且它不可能解密它的输出。
(你可能知道以下内容,但我觉得无论如何都不得不说:制作你自己的加密算法是一项有趣的练习,但是从来没有使用你自己的加密来做任何严肃的事情;它 WILL 被打破。这适用于除专业密码学家之外的所有人,甚至他们必须在任何人梦想使用它们之前提交他们的算法以进行彻底的公开审查。)
答案 1 :(得分:0)
我认为你遇到了麻烦,因为没有额外的辅助信息就无法反转NAND门。
问题是1 ~& 0
与0 ~& 0
相同,因此无法区分输入0和输入1.
答案 2 :(得分:0)
我找到了一种解密不可逆操作(如NAND)的方法,条件是在NAND加密后会生成线索。但是,我认为这当然没有完成,因为它与加密的作用相反 - 安全性。
无论如何,背景首先。由于输入0 & 0
和1 & 0
,NAND是可逆操作。在NAND输入之后,两者都将输出1
。一旦您“解密”它,给定1 & 0
,就无法确定之前的加密位是0
还是1
...除非您生成标记< / em>在NAND加密之后。
为了实现标记,我使用了两个数组 - 0 & 0
的数组A和1 & 0
的数组B.如果您愿意,数组将实例化为完整0
(或1
'。例如,如果每个输入的第4位为0 & 0
,则阵列A的第4位将设置为1
(或0
,如果将其设置为全部1
S)。
然后使用标记数组进行解密。
这是我的程序证明该算法有效的证明。