一个新的加密算法诞生了 ( 积分: 50 )

  • 主题发起人 我爱PASCAL
  • 开始时间
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
九连环,魔方是好的思路.
密码锁的思路也不错啊.几个数字轮子转动.RC4就是基于类似密码锁的概念
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
转轮密码机二战时期的德国就在用了——机械时代,只能依赖于可调整的机械部件实现数
学运算,现在的计算机时代就不一样了,可选的余地大得多。不过,即便复杂如MD5散列算
法,到最后还是能用比解空间小得多的代价去攻击(王小云教授真是厉害,呵呵)。单纯的
依赖移位、加权的算法显然还是不够可靠。经云:道生一,一生二,二生三,三生万物——
我以为,同时采用三种不同的技术才能保证不被人在远低于密码空间信息量的情况下破解。
XOR、移位、加权、叠加、普通轮转、多维轮转、分形轮转、因数分解、椭圆曲线等等,多
了去了。另外,关于密钥流的产生,我曾经看到过报导,说一个人利用三个相互影响的虚拟
神经元产生的随机输出,效果非常好(完全符合“三生万物”的规律,哈哈),楼主可以试
验一下。
谈到VM,我倒是有一个,不过,在我看来,VM也不过是已经出鞘的宝剑——招数已经无法
再变化了——如果真的那么有效,M$肯定会第一个拿过来保护自己的宝贝Wds的。要达到真
正的保护效果,还是要靠通讯点以及通讯通道的安全性防范以及必要的法律手段——不过,
在此之前,可以考虑达到这样的加密效果——比自己水平低的人破不了,比自己水平高的人
不屑于去破解,和自己水平相当的人没有足够功夫去破解[:D]
 

我爱PASCAL

Unregistered / Unconfirmed
GUEST, unregistred user!
一年的网费,已超一天了。
九连环的原理在无线电通迅中得到应用,不过外国人叫格雷码,和九连环是等价的。具体是什么原理,我也不懂,据说这样编码可以抗干挠。
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
VM 的招数就在于动态 VM, 每次运行都生成一只唯一的虚拟 CPU 的话,被破解的机会几乎等于0。当然,如果由于coding能力做不到这点,就另当别论。
微软不用 VM 的原因很简单,因为 VM 有致命的弱点就是慢。对普通的程序可能看不出什么影响,但是用在操作系统上就很明显了。
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,我还以为白兄说的只是在密码验证相关部分使用VM、而在正常运算部分使用正常指
令——这样看起来,如果只能全程使用VM的话,不用它也是可以理解的:)——不过,我还是
更加关心在VM以及Code都是动态生成的前提下,如何保证算法的正确性(类似变异病毒,尽
管可以有百千万亿化身,但是基本功能还是没有变),我在google上找了一下“动态 VM”
——没找到有价值的资料,不知白兄能否为后学指点迷津呢? :)
另外,白兄提到的“每次运行都生成唯一的VM”——如果破解者为运行营造了一个完全被
接管的环境——所有有关系统时间、晶震、乃至CPU指令次数、软硬件序列号、句柄、注册
表等的值都被控制到两次执行没有任何不同,不知道程序如何才能在完全相同的环境中多次
运行而又能生成出“不同”的VM呢?——这好像涉及到计算机环境中从确定性产生不确定性
的问题,哈哈 :)
 
Z

zqw0117

Unregistered / Unconfirmed
GUEST, unregistred user!
大富翁的邮件我怎么老收不到!差点错过这么精彩的讨论!小弟受益匪浅!只能自叹能力不足,不能参与进来一起讨论。实在是遗憾遗憾啊!
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
密码部分相关使用 VM, 正常部分正常指令,这个看起来没什么问题,实际上对大部分攻击
都很有效。但是中级以上的高手一般都会程序抽取,如果被抽取到程序算法,可能就能做到
一些事情了,具体也不好说。
我说说的动态操作码,比如 FF 15,是绝对跳转指令 JMP [XXXXXXXX],但下次生成的时候,
也许变成了 12 34,但 VM CPU 还是会将它解释成 JMP [XXXXXXXX],至于如果分析 CPU
怎么去解释的,那就等于分析一个真实 CPU 了,这次好不容易分析的数据,到下次就不管用
了,估计谁都会头大吧。这样做就不会产生你说哪重问题了。
至于网上找不到相应的资料,
因为事实上要写一只32位CPU的模拟不容易,不过要是其它16位8位CPU就很好找,www.mame.net
的代码全有,不过并不是应用在加密方面的。加密方面的应用软件也是有,不过他们自然是
对此秘而不宣了。
 

我爱PASCAL

Unregistered / Unconfirmed
GUEST, unregistred user!
多谢众多高手的详细点拨,有个问题不明白,就是create-xy朋友的这个双向流式加密法,
从第一个加到最后一个,为什么没有溢出的情况,加法不会造成溢出么。
函数如下:
procedure SeqEnc(var Str: String;
Key: Int64;
Times: Integer);
var
I, J, N: Integer;
Key1, Key2, Key3, Key4: Byte;
begin
n := Length(Str);
if n = 0 then
exit;
Key4 := Byte(Key shr 24);
Key3 := Byte(Key shr 16);
Key2 := Byte(Key shr 8);
Key1 := Byte(Key);
for J := Times - 1do
wnto 0do
begin
Byte(Str[1]) := (Byte(Str[1]) + Key3);
for i := 2 to ndo
Byte(Str) := ((Byte(Str[i - 1]) + Byte(Str)) xor Key1);
Byte(Str[n]) := (Byte(Str[n]) + Key4);
for i := n - 1do
wnto 1do
Byte(Str) := ((Byte(Str[i + 1]) + Byte(Str)) xor Key2);
end;

end;

procedure SeqDec(var Str: String;
Key: Int64;
Times: Integer);
var
I, J, N: Integer;
Key1, Key2, Key3, Key4: Byte;
begin
n := Length(Str);
if n = 0 then
exit;
Key4 := Byte(Key shr 24);
Key3 := Byte(Key shr 16);
Key2 := Byte(Key shr 8);
Key1 := Byte(Key);
for J := Times - 1do
wnto 0do
begin
for i := 1 to n - 1do
Byte(Str) := (Byte(Str) xor Key2 - Byte(Str[i + 1]));
Byte(Str[n]) := (Byte(Str[n]) - Key4);
for i := ndo
wnto 2do
Byte(Str) := (Byte(Str) xor Key1 - Byte(Str[i - 1]));
Byte(Str[1]) := (Byte(Str[1]) - Key3);
end;
end;
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
地址线+数据线 才是王道
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
讨论这么激烈,我也上来凑凑,学习学习。
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
楼主可以考虑结合一下这个帖子的思路,呵呵:)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3707553
 

我爱PASCAL

Unregistered / Unconfirmed
GUEST, unregistred user!
creation-zy介绍贴子的楼主的这个的方法不行,原因如你在贴中所说一样,如果用其加密一幅空白BMP得到的密文中就可以看到密钥了。我现在已不对这类密钥连续XOR的方法有兴趣了。你的双向流式方法到是不错,我想如果改进一下,你不是觉得密钥长度不够么,其实每轮叠加时,也就times改变时,用一个密钥(改变参数Key),比如我们叠加的次数是8次(times=8),我们的密钥长度就是8*4=32字节=32*8=256位。这样的话密文就极不好破解了。
 

我爱PASCAL

Unregistered / Unconfirmed
GUEST, unregistred user!
目前我的研究目标主要放在全息加密算法上,所谓全息就是明文中的任意字节的变动将可能影响生成的密文中的任意字节。比如用在序列号算法中,两个相差一个字节的机器码将生成完全不同的序列号。这样使得破解者很难找到规律搞出注册机来。
对于长的明文,如文件等,可以分成定长度的小块,如8个字节,对这8个字节采用全息算法,生成另8个字节来。
具体思路如下(矩阵全息法):
如果我们将明文的8个字节用x1,x2,x3,x4,x5,x6,x7.x8表示:
密文的8个字节用y1,y2,y3,y4,y5,y6,y7.y8表示。
加密方法如下:
byte(y1)=k11*x1+k12*x2+k13*x3+k14*x4+k15*x5+k16*x6+k17*x7+k18*x8
byte(y2)=k21*x1+k22*x2+k23*x3+k24*x4+k25*x5+k26*x6+k27*x7+k28*x8
.....
byte(y8)=k81*x1+k82*x2+k83*x3+k84*x4+k85*x5+k86*x6+k87*x7+k88*x8
这样就有8*8=64个密钥,每个一字节,可叫作加密密钥矩阵。解密钥钥应为它的逆矩阵。
具体是不是这样的还需要验证一下。其中乘号也可考虑改成xor,不知能得到逆矩阵不。
这个算法还是非对称密钥的算法,再不知算法的情况下,可以公开加密密钥(当然知道
算法了就可以推出解密密钥就是逆矩阵)。加密后的密文如果别人不知道是用什么算法加密的,就不能解密,除非手持解密密钥。
 
B

bmsr

Unregistered / Unconfirmed
GUEST, unregistred user!
只要得到一个种子不同产生的随机数序列就不同的随机函数就可以做很好的加密函数了,睡知道,delphi自带的random 满足以上条件吗?我是用这个函数为基础做的加密函数.我还真没测试过,那个函数的随机序列的分散度.马上写个程序测试以下,如果不行还得重新写过一个随机函数
 
B

bmsr

Unregistered / Unconfirmed
GUEST, unregistred user!
测试完毕,在random函数的的种子randseed 挨个100万前255个序列 无重复,没更大内存,只能这样了.但可见这个随机函数还是基本上是满足要求偶ide我放心了
 
A

a6002173a@163.c

Unregistered / Unconfirmed
GUEST, unregistred user!
[广告被屏蔽]
 
A

a6002173a@163.c

Unregistered / Unconfirmed
GUEST, unregistred user!
[广告被屏蔽]
 

我爱PASCAL

Unregistered / Unconfirmed
GUEST, unregistred user!
我以上提出的矩阵加密法早已有了
是1929年出来的,叫hill方法
其解密矩阵的确是逆矩阵,用xor也是
 
顶部