加密算法,要解密的内容是公开的,难道解密仅仅是要找密钥吗?下面的加密方法是否有问题?(100分)

  • 主题发起人 主题发起人 mycwcgr_temp
  • 开始时间 开始时间
M

mycwcgr_temp

Unregistered / Unconfirmed
GUEST, unregistred user!
请问这样的加密措施是形同虚设吗?
注册程序:
加密:
1.获得硬盘的编号并经简单计算生成一个字串作为用户的序列号
2.将用户的序列号作为明文,并将用户的序列号经过简单计算生成一个密钥,
然后用DES加密算法生成注册码(密文)发给用户!
解密:
1.获得硬盘的编号并经过简单计算生成一个序列号。
2.将用户的序列号经过简单计算生成一个密钥。
3.根据注册码(密文),密钥用DES解密算法生成一个字符串,如果此字符等于序列号
表示注册成功!
为什么采用上面方法生成的注册码会被轻易破解,而且能生成注册机?
请问这是不是DES算法的问题?用RSA算法是否会好一些?
请间谁有RSA控件,最好有源码,谢谢

 
DES算法本身是几乎不可能被破解的,你的问题在于你把私钥泄漏了!
[red]将用户的序列号经过简单计算生成一个密钥[/red],你这里说的应该是私钥,
DES加密算法有一公钥和一私钥,公钥是公开的。你把私钥泄漏了DES本身就无能为力了!
 
DES是对称密钥算法,只有一个密钥。目前, 简单的DES已经不是一个安全的加密算法了,
因为DES的密钥长度只有56bit,已经有能力进行穷举破解。如果选用对称密钥加密,
可以选用采用128bit密钥的IDEA或者112bit密钥的3-DES。
RSA是非对称体制的加密算法,如果希望达到无法破译的地步,密钥长度应该在1024bit
之上。
就你说的生成注册码的问题,并不是采用什么加密算法的问题。做注册机,必不可少的
就是对你的程序进行逆向工程,跟踪得到你的注册码算法。这是无法避免的,如果你的
程序做得好到一个高手看得上眼,那么无论你采用什么算法,最终一定会被破解。,
 
我对加密算法基本是上一窍不通
上面的算法仅仅是我自己的理解,所以被人写出了注册机!
请问drawpharos:
DES加密算法有一公钥和一私钥,公钥是公开的,私钥在什么地方?
上面的算法如何更正?
 
to delphi:
按照您的意思:不论使用什么加密算法,一定能写出注册机?
我知道没有解不了密的软件,我仅仅不希望被人写出注册机
 
如果不希望被写出注册机,就要在注册吗的算法上下很多功夫
理论上,没有写不出的注册机或破解程序,所以不要在这上面下太多的功夫
你应该高兴有人破解你的软件,这说明你的软件很受欢迎。
不过为了保护自己的成果,可以用降低注册费、联机注册验证等方法来解决。
To Delphi: 据我的记忆,DES加密算法用私钥和公钥通过哈西函数来生成加解密各阶段的临时Key(用来异或)
一般是做16次循环。密钥长度在128位时几乎很难用穷举法解密。难道我和其他的加密算法记混了?
 
RSA:='http://ace.ulyssis.student.kuleuven.ac.be/~triade/';
 
to drawpharos:
请问有详细介绍加密算法的资料吗?我想学习一下!
另外如何保护私有密钥,以用户提供的用户名,再作简单计算生成密钥可行吗?
我在网上看到不少人说,采用一些加密算法如RSA可以防止写出注册码,但不能防止
用修改可执行程序的方法,绕过注册验证的所谓暴破解密
 
to drawpharos:
DES是一种对称密钥体制的加密算法,加密解密密钥相同,1981年通过的美国国家标准,
主要原理是64bit的分组置换,密钥使用了64bit中的56bit。目前DES不是一个安全的算法,
NIST也正在制定一个新的美国国家标准-AES。
如果你说密钥长度为128位,那么一定是对称体制,非对称体制密钥一般都很长,至少在
512bit之上。
to: mycwcgr_temp
做注册机甚至没有必要了解你的编码算法是什么!不出意料的话,你的编码算法一定是
做成一个函数或者集中在程序中的某一个地方,只要反汇编你的程序,找到这个地方,
直接拷贝出来就得了。不知道你有没有用过现在的反编译程序,比起以前的那些里还多
了,C甚至Delphi的标准函数可以直接得到名称!
RSA目前主要的用处在于密码交换、身份鉴别,而不是直接用于加密和解密,真正的数据
加密还是通过对称密钥体制实现的,这主要是由于RSA的速度比较慢。
如果你希望了解加密算法,推荐给你一本书:
应用密码学(协议、算法与C源程序) Bruce Schneier的经典密码学著作。
机械工业出版社出版。
 
我在http://ace.ulyssis.student.kuleuven.ac.be/~triade/上下载了RSA控件,下面是它的一个例子:
请问:
1: Base10StringToFGInt('102336547456161301', p);
Base256StringToFGInt('AEFAFGhdhsgoi!?ty!a', q);
Base10StringToFGInt('65537', e);
// just an odd starting point
程序中的这三句话,是否要根据自已的情况修改?它们是不是私有密钥?
2:如果明文已知,是不是只要有人破解出上面三句话中的'102336547456161301','AEFAFGhdhsgoi!?ty!a'
'65537'字符串,就能生成密文?从而做出注册机?
3:RSAEncrypt(test, e, n, test)语句生成的密文是乱码,请问谁能提供一个函数编码为十六进制的数,使之成为可以读的字符串?
4:RSASign(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, signature);
RSAVerify(test, signature, e, n, ok);
上面两句是不是另外一种RSA加密算法?




//-----------------------------------------------------------------------------------------
uses FGInt, FGIntPrimeGeneration, FGIntRSA;
Procedure RSAEncryptAndDecrypt_SignAndVerify;
var
n, e, d, dp, dq, p, q, phi, one, two, gcd, temp, nilgint : TFGInt;
test, signature : String;
ok : boolean;
begin
// Enter a random number to generate a prime, i.e.
// incremental search starting from that number
Base10StringToFGInt('102336547456161301', p);
PrimeSearch(p);
Base256StringToFGInt('AEFAFGhdhsgoi!?ty!a', q);
PrimeSearch(q);
// Compute the modulus
FGIntMul(p, q, n);
// Compute p-1, q-1 by adjusting the last digit of the GInt
p.Number[1] := p.Number[1] - 1;
q.Number[1] := q.Number[1] - 1;
// Compute phi(n)
FGIntMul(p, q, phi);
// Choose a public exponent e such that GCD(e,phi)=1
// common values are 3, 65537 but if these aren 't coprime
// to phi, use the following code
Base10StringToFGInt('65537', e);
// just an odd starting point
Base10StringToFGInt('1', one);
Base10StringToFGInt('2', two);
FGIntGCD(phi, e, gcd);
While FGIntCompareAbs(gcd, one) <> Eq do
begin
FGIntadd(e, two, temp);
FGIntCopy(temp, e);
FGIntGCD(phi, e, gcd);
end;
FGIntDestroy(two);
FGIntDestroy(one);
FGIntDestroy(gcd);
// Compute the modular (multiplicative) inverse of e, i.e. the secret exponent (key)
FGIntModInv(e, phi, d);
FGIntModInv(e, p, dp);
FGIntModInv(e, q, dq);
p.Number[1] := p.Number[1] + 1;
q.Number[1] := q.Number[1] + 1;
FGIntDestroy(phi);
FGIntDestroy(nilgint);
// Now everything is set up to start Encrypting/Decrypting, Signing/Verifying
test := 'eagles may soar high, but weasles do
not get sucked into jet engines';
RSAEncrypt(test, e, n, test);
RSADecrypt(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, test);
// this Is faster : RSADecrypt(test, nilGInt, n, dp, dq, p, q, test);
RSASign(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, signature);
// this Is faster : RSASign(test, nilgint, n, dp, dq, p, q, signature);
RSAVerify(test, signature, e, n, ok);
FGIntDestroy(p);
FGIntDestroy(q);
FGIntDestroy(dp);
FGIntDestroy(dq);
FGIntDestroy(e);
FGIntDestroy(d);
FGIntDestroy(n);
end;
//---------------------------------------------------------------------------------------
 
呵呵,你真的研究起RSA来了,告诉你这个东西对注册码
算法是没有用的。
RSA其实很简单:
1. 选两个大素数p, q
2. 计算n=pq
3. 选取e,使得e与(p-1)(q-1)互素
4. 计算d=e^(-1)mod((p-1)(q-1))
n, e就是RSA的公钥,需要告诉每一个可能像你发送加密信息的人,
d就是私钥,只有你能知道。
但别人要想你发送信息m时,需要使用加密算法将明文m变成秘文c
c=m^(e) (mod n)
你收到秘文c后,使用解密算法变回明文m
m=c^(d) (mod n)
抄一个例子:
取:p=47 q=71
那么:n=pq=3337 (p-1)(q-1)=3220
取:e=79
那么:d=79^(-1) mod 3220 = 1019
加密明文m=688
c=688^(79) (mod 3337) = 1570
解密密文c=1570
m=1570^(1019) (mod 3337) = 688
就这么简单。不过为了足够安全,要求p, q都很大,一般至少要512bit,
这样生成的RSA密钥是1024bit。
可是如果你希望把它做成注册码算法,你肯定要把n, e, d都放到程序里去,
这样和普通的对称密钥算法没有任何区别。
1、这一段程序是为了选p, q和e的。这几个数字一般都是随机产生,然后
验证是否合法的。
TFGInt是大数类型
Base10StringToFGInt应该是把10进制数变成大数类型
Base256StringToFGInt应该是把256进制数(?)变成大数类型
e其实可以固定为65537,对加密效果没有影响
2、只要知道你的d就可以了
3、
S := '';
for i := 1 to length(test) do
S := S + IntToHex(Ord(test), 2);
4、RASSign是进行数字签名
RSAVerify是验证数字签名
这个函数库没有用过,相关内容是分析出来的。
 
To delphi:
谢谢!我想您应该换名为delphi 7.0,因为我认为您已到顶了 D:)
S := '';
for i := 1 to length(test) do
S := S + IntToHex(Ord(test), 2);
上面的算法可以将不可视的字符变为了可视的字符,请帮帮忙,再给一个逆算法,将刚才的要s转化为test
 
To delphi:
很奇怪,绕了一个大圈,又回到了起点。
对于程序的RSA加密注册算法来说,是不是因为要把n, e, d都放到程序里去
所以加密是否成功,关键看如何选择私有密钥,但是私有密钥又不能选择一个固
定的值,只能由硬盘序列号经过简单变换得到,那么解密是不是太容易了,写注册
机是不是太容易了,RSA形同虚设?
另外:
1. 选两个大素数p, q
2. 计算n=pq
3. 选取e,使得e与(p-1)(q-1)互素
4. 计算d=e^(-1)mod((p-1)(q-1))
n, e就是RSA的公钥,需要告诉每一个可能像你发送加密信息的人,
d就是私钥,只有你能知道。
但别人要想你发送信息m时,需要使用加密算法将明文m变成秘文c
c=m^(e) (mod n)
你收到秘文c后,使用解密算法变回明文m
m=c^(d) (mod n)
从上面的过程来看,非常奇怪私有密钥d=e^(-1)mod((p-1)(q-1))是经过
计算得来的,而公钥n, e是公开的,这样岂不是私钥也是公开的?
 
逆算法:
I := 1;
while (I < length(s) do
begin
test[(I - 1) div 2] := StrToInt('$' + S + S[I + 1]);
Inc(I, 2);
end;

正像你看到的,RSA的密钥不是你随便挑的,是要从p, q两个大素数
计算得到的,p, q两个数在计算得到密钥后必须严格保密,最好丢弃。
RSA的安全性是基于大数分解的难度,也就是说从n要逆向得到p, q在目
前是没有什么好方法的,超过了目前计算机所拥有的计算能力。
一旦大数分解这个问题得到解决,RSA也就失去了存在的意义。
 
多人接受答案了。
 
to Delphi,:
呵呵,你真的研究起RSA来了,告诉你这个东西对注册码
算法是没有用的。
RSA其实很简单:
1. 选两个大素数p, q
2. 计算n=pq
3. 选取e,使得e与(p-1)(q-1)互素
4. 计算d=e^(-1)mod((p-1)(q-1))
n, e就是RSA的公钥,需要告诉每一个可能像你发送加密信息的人,
d就是私钥,只有你能知道。
但别人要想你发送信息m时,需要使用加密算法将明文m变成秘文c
c=m^(e) (mod n)
你收到秘文c后,使用解密算法变回明文m
m=c^(d) (mod n)
我在网上找到资料:(http://www.pediy.com/tutorial/chap6/Chap6-3-1.htm)
一、RSA算法 :
首先, 找出三个数, p, q, r,
其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数......
p, q, r 这三个数便是 private key

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1).....
这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了.....
再来, 计算 n = pq.......
m, n 这两个数便是 public key

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n....
如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t),
则每一位数均小於 n, 然後分段编码......
接下来, 计算 b == a^m mod n, (0 <= b < n),
b 就是编码後的资料......
它说的公钥、私钥的生成方法跟你说的不一样啊!请务必回答我!谢谢啦!
 
呵呵,看了半天明白了,其实是一样的!
因为非对称加密的密钥对是可以互换的。
即私钥加密--用钥解密可以
共钥加密--私钥解密也可以。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部