[求助]RAS加密算法求解

GDSoftware 2006-08-03 08:53:50
各位帮忙看看下面的RAS加密算法,,现求其解密的算法。

string ls_str
string sn = ""
ulong lul_temp
ulong lul_x
ulong lul_x0
ulong lul_x1
integer i
integer li_d
integer li_n


li_d = 7
li_n = 33
ls_str = trim(id) //id 为序列号

do until ls_str = ""

if left(ls_str,1) = "2" then
lul_temp = integer(mid(ls_str,2,2))
ls_str = right(ls_str,len(ls_str) - 3)
else
lul_temp = integer(mid(ls_str,2,1))
ls_str = right(ls_str,len(ls_str) - 2)
end if

lul_x0 = 1
lul_x1 = 1

for i = 1 to 4
lul_x0 = lul_x0 * lul_temp
next

lul_x0 = mod(lul_x0,33)

for i = 1 to li_d - 4
lul_x1 = lul_x1 * lul_temp
next

lul_x1 = mod(lul_x1,33)
lul_x = mod(lul_x0 * lul_x1,33)
sn = trim(sn) + string(lul_x)
loop


...全文
616 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kongl123 2006-08-22
  • 打赏
  • 举报
回复
我明白你的意思了,我指的对密文的分割不存在原加密算法中的法则。它是直接分割的,而没有2非2的判断。
对你的例子124466880,
如果这是一个明文,对它加密其实就是取出2,4,6,8进行分别加密,然后把这些分段密文合并成124466880的密文。
而如果它是我所指的密文的话,即某个明文X加密后变成124466880,现在要恢复X。那我就先对124466880分割,且保证分割后的每个子密文<33 。它的分割是不用加密算法中的算法的。可以直接分成1,2,4,4,6,6,8,8,0(其中的每一个数我称它为一个子密文)或12,4,4,6,6,8,8,0或1,24,4,6,6,8,8,0这三种组合。对这三组进行逆算法的。
kongl123 2006-08-22
  • 打赏
  • 举报
回复
124466880 是取到:[2][4][6][8][0]吗?我觉得是:[2][4][6][8]啊。
因为取了8后只剩下0,这时要取lul_temp = integer(mid(ls_str,2,1)),也就是0的下一个,就是空了啊?mid(str,start,n)是返回在str中,从start开始的n个字符吧?“Character position in string at which the part to be taken begins. If start is greater than the number of characters in string, Mid returns a zero-length string ("").”(摘自MSDN)。你指的mid函数是这样返回的吧?
GDSoftware 2006-08-22
  • 打赏
  • 举报
回复
RAS 和 RSA是一样的,,,只有过是叫反了吧.正确的叫法是 RSA .是一种加密算法.

Remote Access Server远程访问服务,,, 不相干的.



yaos 2006-08-22
  • 打赏
  • 举报
回复
RAS 和 RSA什么关系?
和Remote Access Server有关系么?
GDSoftware 2006-08-22
  • 打赏
  • 举报
回复
关键代码:

if left(ls_str,1) = "2" then
lul_temp = integer(mid(ls_str,2,2))
ls_str = right(ls_str,len(ls_str) - 3)
else
lul_temp = integer(mid(ls_str,2,1))
ls_str = right(ls_str,len(ls_str) - 2)
end if

奇怪的字符串分组. 如字符串:124466880 经过上面的算法分组成为:[2][4][6][8][0]

对密文进行分割,且保证分割后的每个子密文<33 但原加密算法中却出现:

对字串24680 分组后为:[46] [0]

对字串:112233445566778899 分组后为:[1],[23],[4],[5],[6],[7],[8],[9],[0]

对字串:123456789 分组后为:[2],[4],[6],[8],[0],

对字串:23484608 分组后为:[34],[4],[0],[0],

看来要逆返求解必须先解决这个分组算法.
kongl123 2006-08-22
  • 打赏
  • 举报
回复
这样对密文最后的0多加上空这种情况就可以了
GDSoftware 2006-08-22
  • 打赏
  • 举报
回复
对于字串124466880分组后的结果分别为:[2],[4],[6],[8],[0], 最后一个取0 因为上面一个判断 do until ls_str = "" 只要ls_str不为空.
每一步的执行情况为:
lul_temp = integer(mid("124466880",2,2)) 结果为:2
lul_temp = integer(mid("4466880",2,2)) 结果为:4
lul_temp = integer(mid("66880",2,2)) 结果为:6
lul_temp = integer(mid("880",2,2)) 结果为:8
lul_temp = integer(mid("0",2,2)) 结果为:0

上面的分组是明文分组,也就是说用

if left(ls_str,1) = "2" then
lul_temp = integer(mid(ls_str,2,2))
ls_str = right(ls_str,len(ls_str) - 3)
else
lul_temp = integer(mid(ls_str,2,1))
ls_str = right(ls_str,len(ls_str) - 2)
end if


分组后的结果。

经过上面的分组后,结果为:24680


看来我的线路错了。


kongl123 2006-08-21
  • 打赏
  • 举报
回复
如果方便,你可以说种出错的情况,大家可以一起讨论:)
kongl123 2006-08-21
  • 打赏
  • 举报
回复
应该不会错吧,不过要注意不能分能"0x"这样的形式。
GDSoftware 2006-08-21
  • 打赏
  • 举报
回复
并且对在密文进行分割,且保证分割后的每个子密文<33 时发现只要密文中有0 进行运算时就错了。

会不会是这个算法不能处理 0 的问题吗?
GDSoftware 2006-08-21
  • 打赏
  • 举报
回复
感谢 kongl123 。经您的分析发现这个算法明文确实是很多。




kongl123 2006-08-21
  • 打赏
  • 举报
回复
还应注意这样得到的明文的最后可以加上任意一位或不加,当然前提是得到的明文不为0。

在上面我的思路中还有遗漏:对一个明文取了前面的n位后,剩下的只有两位,且以2开头即:“2x”,因此,对每个划分的最后一个子密文的原文前可以为任意一位数(上面的分析说它不能为2是不够的)。
kongl123 2006-08-21
  • 打赏
  • 举报
回复
////////////////////////////////////////////////
lul_x0 = 1
lul_x1 = 1

for i = 1 to 4
lul_x0 = lul_x0 * lul_temp
next

lul_x0 = mod(lul_x0,33)

for i = 1 to li_d - 4
lul_x1 = lul_x1 * lul_temp
next

lul_x1 = mod(lul_x1,33)
lul_x = mod(lul_x0 * lul_x1,33)
///////////////////////////////////////////////////////////

上面由于li_d是定值,代码等价为 lul_x = mod(lul_temp^li_d,33)。
于是可以得到下面的逆算法:


假设一个密文为x可以表示成十进制展开为:b[n]*10^n+b[n-1]*10^(n-1)...b[0]*10^0,
那么,先对b[0 to n]进行1至2位不等的划分,并得出所有这样的组合,如密文
3414155->3,4,1,4,15,5或3,4,14,1,55;然后从这些组合中出掉有>=33的组合,如应该
去掉前面有55划分的这个组合。则剩下的这些组合,每一个可以生成与之对应的多种对应明文,
即有这么多种明文可以生成这个密文。这是说了结果,分析看下面:

由于裁数是通过2、非2来确定,对裁数这一关来说明文相当于2进制。如果通过这次裁剪,
把原数分成c[0],c[1]...c[n],那么可以通过c[i]是几位数来判定它前一位数是2或非2。
设这时对应的密文为d[i] = (c[i]^li_d mod 33),那么知道密文d[i],必存在对应的多个c[i],且
0<=c[i]<=99,(这里li_d = 7)这是因为c[i]^7 mod 33,当c[i]=0 to 99时可以取便0 to 32。所以,
只要把密文分成不大于32的字串,这个字串就能生成一组明文,而这样的划分不唯一。又对每
一组划分来说,d[i]->c[i]是1对多的关系,再当c[i]为一位数时,对应的前一位可以是所有非2的
一位数(第一个密文数对应明文前不为0),所以很明显对应每组划分的明文也有多种。

这样分析,就不难写出逆程序了(只是明文较多)。写下简单的思路:

对密文进行分割,且保证分割后的每个子密文<33
对所有这样的分割进行求逆,方法为对每个子密文求逆,然后合并。
子密文的求逆法为:设d为密文,则找出所有使d = c^li_d mod 33,且0<=c<=99成立的c
再通过c的位数判定c前的是2还是非2。
连接所有子密文的明文为一个明文。
然后对下一个分割求逆。
GDSoftware 2006-08-20
  • 打赏
  • 举报
回复
求各高手帮忙分析一下...
GDSoftware 2006-08-04
  • 打赏
  • 举报
回复
算法是有点难度。 这个算法可以对数进行加密,但加完后回不到原来的值了。

此算法是参考:http://www.pcdog.com/p/html/2004124/41220041366_2.htm 修改而成。

应该是可以还原的。


盼望大家帮助分析一下。


GDSoftware 2006-08-03
  • 打赏
  • 举报
回复
谢谢,yyfhz(火山) 您的回答。


这个算法是这样的,,输入一个数ID 如:421073913 经过算法后的结果为:290910 ,现知道:290910 想通过运算求得原来的ID 421073913 。

您提到的ID 1567 和 3567 情况,确实如此。均为:1428
yyfhz 2006-08-03
  • 打赏
  • 举报
回复
这个算法输入的id,输出的是sn吗?若是,由于该算法中的id和sn不是一一对应的关系,因此不存在完整的逆运算。
在以下几处存在id信息丢失的情况
1.
if left(ls_str,1) = "2" then
lul_temp = integer(mid(ls_str,2,2))
ls_str = right(ls_str,len(ls_str) - 3)
else
lul_temp = integer(mid(ls_str,2,1))
ls_str = right(ls_str,len(ls_str) - 2)
end if

由于ls_str中没有纪录left(ls_str,1)的值,而只是将它与"2"进行了比较,
而且这之后lsft(ls_str,1)的值就被删除不用了,
因此任何left(ls_str,1)不为2的情况都会被认为是相同的。
也就是说id = 1567和id=3567加密的结果是完全一样的。

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧