还是从《应用密码学当》中节录下来的一段话(P10-P11):
这是一个对称算法。明文用一个关键字做异或运算以产生密文。因为用同一只取一或两次就会付出原来的值,所以加密盒解密都严格采用同一个程序。
这种方法没有实际的保密性,它易于破译,甚至没有计算机也能破译,如果用计算机则只需花费几秒钟的时间就可破译。
假设明文是英文,而且假设密钥长度是一个任意小的字节数,下面是他的破译方法:
1、用重合码计数法(counting coincidence)找出密钥长度。用密文异或相对其本身的各种字节的位移,统计那些相等的字节。如果位移是密钥长度的倍数,那么超过6%的字节将是相等的,如果不是,则至多只有0.4%的字节是相等的(这里假设用一随机密钥来加密标准ASCII文本;其他类型的明文将有不同的数值),这叫做重合指数(index of coincidence)。指出密钥长度倍数的最小位移即密钥的长度。
2、按此长度移动密文,并且和自身异或。这样就消除了密钥,留下明文和移动了密钥长度的明文的异或。由于英语每字节有1.3位的实际信息(参见11.1节),因此有足够的冗余度去确定位移的解密。
尽管如此,一些软件销售商在兜售这种游戏式算法时,还声称“几乎和DES一样保密”,这使人感到震惊。NSA最终允许美国的数字蜂窝电话产业界使用这个算法(有160位的重复“密钥”)对语音保密。异或或许能防止你的小妹妹偷看你的文件,但却不能防止密码分析家在几分钟内破译它。
可以这么认为,如果你用异或进行加解密,那么跟直接保存明文就没有什么差别。因为一旦取得了密文,并且知道使用的是异或算法,那么剩下来的保密时间就在几秒钟到几小时之内。即使一个没有什么密码学知识的人,也可能写出一个什么工具来进行破解计算。或者说你如果采取了异或加密算法,那么整个系统的安全性就根本不在你手中,那么你加上这个算法和不加上又有什么区别呢?干脆不要加算了。
打印 | 张贴于 2004-08-05 12:24:00 | Tag:其他

留言反馈
用异或改变明文到密文的做法没有错。
关键是看密钥的长度。如果密钥的长度大于明文的长度用异或加密又何尝不可呢。
leighsword 用随机数的方法加密。看起来是不可还原的。但值得注意。他使用的随机数函数是rand()。只要种子与加密时的相同。还原时可以产生相同的随机数序列。
如果这样理解,把种子称作密钥也许更好些。
我的email:tryitpl_cn@sina.com.cn,
目前的研究成果,方向。。。
(就是说加密后的文件中在不固定的位置插入不固定的密码来决定文件的排序),
而且异或密文由原文+密码按一定方法产生,
再加上二次异或多次异或操作,
这样相信破解是很困难的,而且每次产生的加密文件都是不一样的...
人家ECC演算法是可以作成晶片的 , 可以硬體化的 , 可以用在IC卡上的
上面那個po密文的老兄
用隨機數的演算法 , 能作成硬體嗎 XD?
還有 , 現階段能作成硬體的random number IP , 都是很容易可逆的 .
我馬上就把破解你那個的觀念講出來吧~
首先移位回去(廢話)
然後你的隨機數的範圍能多大 我就把那範圍的隨機數都try一遍 也就是了
如果你的方法想跟ECC一樣可用於硬體中 , 你以為你又能提供多大的隨機數(提供越大 , 晶片成本成長的可怕!!)
ECC利害的地方就是可以硬體化
拜託 , 大家都是中國人的話 , 那大陸地區的科技討論水準實在是讓我很失望了 ~
不知道对不对,我是把原来LeighSword贴的代码改成:
#include "stdio.h"
typedef char* LPCSTR;
typedef char* LPSTR;
typedef unsigned int size_t;
char g_szSeed[5] = {'p','a','s','s','t'}; //full is 26
bool bCompress(LPCSTR lpstrSrc,LPSTR lpstrDen,unsigned long lLen)
{
//_Assert(lLen > 0); //like "if"
unsigned long i;
char chCurSeed;
if(lLen>0)
{
size_t nSeedCount = sizeof(g_szSeed)/sizeof(char);
//in this case is nSeedCount=5/1=5
for(i=0;i<lLen;++i)
{
chCurSeed = g_szSeed[i%nSeedCount];
if(*(lpstrSrc + i))
{
*(lpstrDen + i) = (chCurSeed) ^ *(lpstrSrc + i);
}
else
{
*(lpstrDen + i) = *(lpstrSrc + i);
}
}
return true;
}
}
main()
{
char a[16],b[16];
int ii,si,aa,bb,cg;
printf("choose:");
scanf("%d",&si);
if(si!=1)
{
for(ii=0;ii<15;ii++)
{
scanf("%c",&a[ii]);
}
for(ii=0;ii<15;ii++)
{
printf("%d ",a[ii]);
}
printf("\n");
for(ii=0;ii<15;ii++)
{
bCompress(&a[ii],&b[ii],99);
}
for(ii=0;ii<15;ii++)
{
printf("%d ",b[ii]);
}
}
else
{
printf("enter num:");
scanf("%d",&aa);
printf("\nenter xor num:");
scanf("%d",&cg);
bb=aa^cg;
printf("%d",bb);
}
}
并用黑盒子测试法作的测试。
CC1rcwLN
CC7vdQ8v
CC1qRQhY
CC1rcwLN
上面这样的密码有人见过吗?
一般是什么样子的算法加密的?
从密文的文字使用上来讲比较像base64,但是肯定不会这样简单。。。。
哪位高手见过这样子的?
依赖于对算法保密的密码算法都是非常危险的算法。很多人自己写了一套算法,在自己看来好像不可逆推,但在专家手上细细分析就有很多漏洞可以破解。所以,在声称自己的算法本身有多高强度之前一定要事先经得N多专定N年的论证。切记切记。
也可以算是吧,至少从广义的角度来说是可以这么认为的。
对于自视甚高发明算法的人,没有必要去用证明他们的算法强度,因为他们自己都无法给出严格的数学证明,这才是最关键,但是他们顶多给出猜想来证明,顶多说几个“显然““因此““不怕死得就来试试”这样幼稚的话。他们以为上厕所的时候就能随随便便的发明出算法。让我们来做个游戏:
地上散落着很多扑克牌,有的正面朝上,有的背面朝上,我现在要求你给我5张背面朝上的扑克牌。
A先来,他闭上眼睛,然后从地上捡起5张,再睁开眼睛,发现不是5张背面朝上,他重新闭上眼睛,捡起5张,再睁开眼睛…直到5张都是背面朝上为止。根据概率统计他取正确的几率是2的5次方分之一,但是即便如此,他也不能保证在32次内取对,今天很不幸A够衰,他取到44次终于取得正确了,于是他兴奋的得出结论:强度是44。
轮到B了,B比较聪明,他闭上眼睛,从地上捡起一张,再睁开眼睛,如果发现不是背面朝上,那么他就把牌翻过来,继续捡下一张,直到捡完5张,根据概率统计他最多也只需要10次就可以保证取得5张背面朝上的牌。今天B也很衰,第10次才正确,于是B得出结论:强度为10
轮到C了,C直接睁开眼睛,从地上捡起5张背面朝上的牌,1次就成功了。
做完这个游戏我们能领悟到什么?A就是那传说中的白痴,他自以为强度是5bit的,虽然B不够聪明但是他能够保证10次内取得,能够证明A的结论错误,而C更聪明。
不要随便指望你发明的强度有你设计的那样高,也许真的有这么高,但是即便如此,你都无法从数学上证明。你的128bit的算法恐怕最后连8bit都没有。目前的加密算法都是基于当前无法解决的数学难题来实现的,这样的实现是可行的,都是由理论根据的,一旦该数学难题被破解,那么理论基础也就不存在了,相应的算法就自然而然的要被淘汰。很多发明算法的人的理论基础又是什么呢?从理论到实现都是臆造,证明也是某某式猜想。这种幼稚的东西也只能用来作为toy。玩玩就行了,但是千万不要搞得太认真,害人害己。
#B%&%&JHUJGTVB%'
$C&'&'KIVKHUWC&(
%D'('(LJWLIVXD')
&E()()MKXMJWYE(*
'F)*)*NLYNKXZF)+
(G*+*+OMZOLY[G*,
)H+,+,PN[PMZ\H+-
*I,-,-QO\QN[]I,.
+J-.-.RP]RO\^J-/
,K././SQ^SP]_K.0
-L/0/0TR_TQ^`L/1
.M0101US`UR_aM02
/N1212VTaVS`bN13
0O2323WUbWTacO24
1P3434XVcXUbdP35
2Q4545YWdYVceQ46
3R5656ZXeZWdfR57
4S6767[Yf[XegS68
5T7878\Zg\YfhT79
6U8989][h]ZgiU8:
7V9:9:^\i^[hjV9;
8W:;:;_]j_\ikW:<
9X;<;<`^k`]jlX;=
:Y<=<=a_la^kmY<>
;Z=>=>b`mb_lnZ=?
<[>?>?canc`mo[>@
=\?@?@dbodanp\?A
>]@A@Aecpeboq]@B
?^ABABfdqfcpr^AC
@_BCBCgergdqs_BD
A`CDCDhfshert`CE
BaDEDEigtifsuaDF
CbEFEFjhujgtvbEG
DcFGFGkivkhuwcFH
EdGHGHljwlivxdGI
FeHIHImkxmjwyeHJ
GfIJIJnlynkxzfIK
HgJKJKomzoly{gJL
IhKLKLpn{pmz|hKM
JiLMLMqo|qn{}iLN
KjMNMNrp}ro|~jMO
LkNONOsq~sp} kNP
MlOPOPtr tq~!lOQ
NmPQPQus!ur "mPR
OnQRQRvt"vs!#nQS
PoRSRSwu#wt"$oRT
QpSTSTxv$xu#%pSU
RqTUTUyw%yv$&qTV
SrUVUVzx&zw%'rUW
TsVWVW{y'{x&(sVX
UtWXWX|z(|y')tWY
VuXYXY}{)}z(*uXZ
WvYZYZ~|*~{)+vY[
XwZ[Z[ }+ |*,wZ\
Yx[\[\!~,!}+-x[]
Zy\]\]" -"~,.y\^
[z]^]^#!.# -/z]_
\{^_^_$"/$!.0{^`
]|_`_`%#0%"/1|_a
^}`a`a&$1}`b
_~abab'%2'$13~ac
` bcbc(&3(%24 bd
a!cdcd)'4)&35!ce
b"dede*(5*'46"df
c#efef+)6+(57#eg
d$fgfg,*7,)68$fh
e%ghgh-+8-*79%gi
f&hihi.,9.+8:&hj
g'ijij/-:/,9;'ik
h(jkjk0.;0-:<(jl
i)klkl1/<1.;=)km
j*lmlm20=2/<>*ln
k+mnmn31>30=?+mo
l,nono42?41>@,np
m-opop53@52?A-oq
n.pqpq64A63@B.pr
o/qrqr75B74AC/qs
p0rsrs86C85BD0rt
q1stst97D96CE1su
r2tutu:8E:7DF2tv
s3uvuv;9F;8EG3uw
t4vwvw<:G<9FH4vx
u5wxwx=;H=:GI5wy
v6xyxy><I>;HJ6xz
w7yzyz?=J?<IK7y{
x8z{z{@>K@=JL8z|
y9{|{|A?LA>KM9{}
z:|}|}B@MB?LN:|~
{;}~}~CANC@MO;}
|<~ ~ DBODANP<~!
}= ! !ECPEBOQ= "
~>!"!"FDQFCPR>!#
90%以上的加密解密只需要了解算法就可以了。。。
并且有明文和密文对照的基础上的
:D:D
smart guy啊,确实如此,最重要的要找出"Seed"。
xikug@163.com
就像我前面说的,够用就好(本算法只限于大陆地区,但并不包括台湾,中国香港等地区),任何加密算法都不是安全的,但你要看这个算法在哪个区域使用,给哪些人使用。
不懂不要乱说。。。
光说没意思,要做出来才算数
我不可以在中间留出一段buffer来保存我的随机数。
再告诉你一个道理,东西是死的,人是活的。
随机数都用上了。。。厉害哈。。。这样的算法你能还原吗?
满口胡说
你那个算法算个P啊。。。
世界上最坚固的椭圆曲线加密算法都被破解了
char chCurSeed = g_szSeed[rand() % nSeedCount];
char g_szSeed[5/*26*/] = {
'a', 'b', 'c' ,'1', '2',
};
BOOL Compress(LPCSTR lpstrSrc, LPSTR lpstrDen, unsigned long lLen){
_ASSERT(lLen > 0);
size_t nSeedCount = sizeof ( g_szSeed ) / sizeof(char);
for(unsigned long i = 0 ; i < lLen; ++i ){
char chCurSeed = g_szSeed[i % nSeedCount];
if(*(lpstrSrc + i))
*(lpstrDen + i) = (chCurSeed ^ *(lpstrSrc + i));
else
*(lpstrDen + i) = *(lpstrSrc + i);
}
return TRUE;
}
//移位的过程我有所保留了,he he,俗话说万事不要做得太绝了,要留一手先。。。
//有种的就给出解密的算法?
还有打印机程序加密,多不可数。估计他们只想不让一般用户不小心操作有误看到这样的信息罢了。
最后我想让大家知道,够用才是最好的。
你要破解必需要知道我的26个加密种子,况且你知道也没有,因为我移过位了.