Pb加密解密算法问题

zggm405 2014-04-23 10:34:11
加密函数:
String ls_case,ls_asc,ls_one,ls_repassword,ls_asc2,ls_char
Integer i,li_word
integer li_e, li_d, li_n,li_len,li_char

ls_case = trim(as_password)
IF len(ls_case) <= 0 THEN RETURN('')
FOR i = 1 TO Len(ls_case)
ls_one = String(Asc(Mid(ls_case,i,1)))
ls_asc = ls_asc + Right('000' + ls_one,3)
NEXT
//加密
li_e = 3 //设置指数E,加密密钥
li_d = 7 //解密密钥
li_n = 33 //两个素数得乘积
string ls_str,ls_group
ls_str = ls_asc
ulong lul_temp
lul_temp = 0
ulong lul_x, lul_y // lul_x 加密明文,lul_y 加密密文
do until ls_str = ""
ls_group = left(ls_str,2)
lul_temp = Integer(left(ls_str, 2))
if lul_temp >= li_n then
lul_temp = Integer(left(ls_str, 1))
ls_str = right(ls_str, len(ls_str)-1)
else
ls_str = right(ls_str, len(ls_str)-2)
end if
lul_y = 1
for I = 1 to li_e
lul_y = lul_y * lul_temp
next
lul_y = mod(lul_y, li_n)
IF left(ls_group,1) = '0' AND Len(ls_group) = 2 THEN
ls_repassword = trim(ls_repassword) + '00' + Right('00' + string(lul_y),2)
ELSE
ls_repassword = trim(ls_repassword) + Right('00' + string(lul_y),2)
END IF
loop
li_len = len(ls_repassword)
//将字符窜转换城整形作为ASC,再将ASC转换为字符。
ls_asc2 = ''
FOR i = 1 TO li_len
ls_char = char(integer(mid(ls_repassword,i,1)))
ls_asc2 = ls_asc2 + ls_char
NEXT
RETURN ls_asc2

解密函数:

String ls_case,ls_asc,ls_one
String ls_str,ls_str1,ls_char
ulong lul_temp
integer li_e, li_d, li_n,i,li_len
ulong lul_x0, lul_x1 ,lul_x,lul_y
ls_asc = ai_pass
li_len = len(ls_asc)
ls_char = ''
FOR i = 1 TO li_len
ls_char =ls_char + string(asc(mid(ls_asc,i,1)))
NEXT
ls_asc = ls_char
IF len(trim(ls_asc)) <= 0 THEN RETURN('')

li_e = 3
li_d = 7
li_n = 33

ls_str = Trim(ls_asc)
do until ls_str = ""
lul_temp = Integer(left(ls_str, 2))
if lul_temp >= li_n then
lul_temp = Integer(left(ls_str, 1))
ls_str = right(ls_str, len(ls_str)-1)
else
ls_str = right(ls_str, len(ls_str)-2)
end if

lul_x = 1

FOR i = 1 TO 7
lul_x = lul_x * lul_temp
IF i = 3 THEN
lul_x0 = lul_x
lul_x = 1
END IF
IF i = 6 THEN
lul_x1 = lul_x
lul_x = 1
END IF
NEXT
lul_y = mod((mod(lul_x0,33) * mod(lul_x1,33) * mod(lul_x,33)), 33)
ls_str1 = trim(ls_str1) + string(lul_y)
Loop

FOR i = 1 TO Len(ls_str1) step 3
ls_one = char(Integer(Mid(ls_str1,i,3)))
ls_case = ls_case + ls_one
NEXT
RETURN ls_case


麻烦各位高手帮看下,加密函数没有问题,但解密函数解加密的字符为乱码,那个地方写的有问题,望指教
...全文
509 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
WorldMobile 2014-04-24
  • 打赏
  • 举报
回复
引用 4 楼 LSTAR710 的回复:
这个就是用户密码存数据库后加密,不存在非标准字符。
加密后会不会出来百标准字符?
pcwe2002 2014-04-24
  • 打赏
  • 举报
回复
密码存数据库加密直接md5, 只用比较加密后的字体符串。不用解密的。 或者你直接就用原来的加密,比较加密后的就行了。密码不需要解密。
WorldMobile 2014-04-23
  • 打赏
  • 举报
回复
估计这个加解算法在PB中有问题,比如char转换如果是0或者非标准字符时,加密或解密都可能出问题
WorldMobile 2014-04-23
  • 打赏
  • 举报
回复
代码太乱了,帮你整理一下,方便大家看

加密函数:
String ls_case,ls_asc,ls_one,ls_repassword,ls_asc2,ls_char
Integer i,li_word
integer li_e, li_d, li_n,li_len,li_char

ls_case = trim(as_password)
IF len(ls_case) <= 0 THEN RETURN('')
FOR i = 1 TO Len(ls_case)
	ls_one = String(Asc(Mid(ls_case,i,1)))
	ls_asc = ls_asc + Right('000' + ls_one,3)
NEXT
//加密
li_e = 3  //设置指数E,加密密钥
li_d = 7 //解密密钥
li_n = 33 //两个素数得乘积
string ls_str,ls_group
ls_str = ls_asc
ulong lul_temp 
lul_temp = 0 
ulong lul_x, lul_y  // lul_x 加密明文,lul_y 加密密文
do until ls_str = "" 
	ls_group = left(ls_str,2)
	lul_temp = Integer(left(ls_str, 2)) 
	if lul_temp >= li_n then
		lul_temp = Integer(left(ls_str, 1)) 
		ls_str = right(ls_str, len(ls_str)-1) 
	else 
		ls_str = right(ls_str, len(ls_str)-2) 
	end if 
	lul_y = 1 
	for I = 1 to li_e 
		lul_y = lul_y * lul_temp 
	next 
	lul_y = mod(lul_y, li_n)
	IF left(ls_group,1) = '0' AND Len(ls_group) = 2 THEN
		ls_repassword = trim(ls_repassword) + '00' + Right('00' + string(lul_y),2) 	
	ELSE	
		ls_repassword = trim(ls_repassword) + Right('00' + string(lul_y),2)
	END IF	
loop 
li_len = len(ls_repassword)
//将字符窜转换城整形作为ASC,再将ASC转换为字符。
ls_asc2 = ''
FOR i = 1 TO li_len
	ls_char = char(integer(mid(ls_repassword,i,1)))
	ls_asc2 = ls_asc2 + ls_char
NEXT
RETURN ls_asc2

解密函数:

String ls_case,ls_asc,ls_one
String ls_str,ls_str1,ls_char
ulong lul_temp
integer li_e, li_d, li_n,i,li_len
ulong lul_x0, lul_x1 ,lul_x,lul_y
ls_asc = ai_pass
li_len = len(ls_asc)
ls_char = ''
FOR i = 1 TO li_len
	ls_char =ls_char + string(asc(mid(ls_asc,i,1)))	
NEXT
ls_asc = ls_char
IF len(trim(ls_asc)) <= 0 THEN RETURN('')

li_e = 3 
li_d = 7 
li_n = 33 

ls_str = Trim(ls_asc)
do until ls_str = "" 
	lul_temp = Integer(left(ls_str, 2)) 
	if lul_temp >= li_n then 
		lul_temp = Integer(left(ls_str, 1)) 
		ls_str = right(ls_str, len(ls_str)-1) 
	else 
		ls_str = right(ls_str, len(ls_str)-2) 
	end if 
	
	lul_x = 1
	
	FOR i = 1 TO 7
		lul_x = lul_x * lul_temp
		IF i = 3 THEN 
			lul_x0 = lul_x
			lul_x = 1
		END IF	
		IF i = 6 THEN 
			lul_x1 = lul_x
			lul_x = 1
		END IF	
	NEXT
	lul_y = mod((mod(lul_x0,33) * mod(lul_x1,33) * mod(lul_x,33)), 33) 
	ls_str1 = trim(ls_str1) + string(lul_y)
Loop

FOR i = 1 TO Len(ls_str1) step 3
	ls_one = char(Integer(Mid(ls_str1,i,3)))
	ls_case = ls_case + ls_one
NEXT
RETURN ls_case
zggm405 2014-04-23
  • 打赏
  • 举报
回复
是不是加密的算法本身就有问题?
zggm405 2014-04-23
  • 打赏
  • 举报
回复
这个就是用户密码存数据库后加密,不存在非标准字符。

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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