回 帖 发 新 帖 刷新版面

主题:[原创]对输入的信息进行加密,密钥...

密钥可以通过给定参数更改,且该参数随加密了的信息一起发送,并在阅读(需要权限)时自动插入“锁孔”。需要说明的是,密钥由参数唯一确定,但只截获参数,即使在理论上也无法算出密钥!故收发信息的双方自始至终无人知道真正的密钥是什么。


[em12]


REM code and uncode
choice: PRINT "to code, press 1"
PRINT "to uncode, press 2"
PRINT "to clear the screen, type CLS"
PRINT "to exit, type sy"
PRINT
INPUT "i want to ", c$
IF c$ = "sy" THEN END
IF c$ = "cls" THEN CLS
IF c$ = "1" THEN GOTO code
IF c$ = "2" THEN GOTO uncode ELSE GOTO choice

code: FOR x = 1 TO 2 STEP 0
PRINT
INPUT "text to be code:", text$
LET cd = LEN(text$)
IF text$ = "sy" THEN END
IF text$ = "ws" THEN GOTO choice
q = 1
FOR i = 1 TO cd STEP 1
LET zm$ = MID$(text$, i, 1)
LET zmasc = ASC(zm$)
zmasc = zmasc + q
LET zmhy$ = CHR$(zmasc)
PRINT zmhy$;
q = q + 1
IF q = 4 THEN q = 1
NEXT i
NEXT x
END


uncode: FOR x = 1 TO 2 STEP 0
PRINT
INPUT "text to be uncode:", text$
LET cd = LEN(text$)
IF text$ = "sy" THEN END
IF text$ = "ws" THEN GOTO choice
q = 1
FOR i = 1 TO cd STEP 1
LET zm$ = MID$(text$, i, 1)
LET zmasc = ASC(zm$)
zmasc = zmasc - q
LET zmhy$ = CHR$(zmasc)
PRINT zmhy$;
q = q + 1
IF q = 4 THEN q = 1
NEXT i
NEXT x
END

以上是简略版,不含对密钥的更改,但只需再加入一个input 语句就可解决问题。

回复列表 (共7个回复)

沙发

 千万不要在循环问题或及特殊问题外再用goto

板凳

那个程序很好啊,简洁而实用;
但我觉得其实两个程序思路不同,一个是加密码,另一个是对输入的字符串返回一串看似“乱码”的字符,能且只能将加密的信息字符串输入给该程序,才能得到原始信息。这个程序的目的是对要送出的信息(比如e-mail)中重要的部分(比如存折密码[em2])进行一次加密处理,这样即使信息被截获,截获者也无从得知真正的信息,从根本上避免了密码被破解带来的麻烦。而且,由于加密密钥始终只有程序自己知道,又是一次性使用,就使信息被破解的可能性从理论上讲不存在。

3 楼

DO
choice: PRINT "to code, press 1"
PRINT "to uncode, press 2"
PRINT "to clear the screen, type CLS"
PRINT "to exit, type sy"
PRINT
INPUT "i want to ", c$
IF c$ = "sy" THEN EXIT DO
IF c$ = "cls" THEN CLS
IF c$ = "1" THEN GOSUB code
IF c$ = "2" THEN GOSUB uncode
LOOP
END

code:
FOR x = 1 TO 2 STEP 0
PRINT
INPUT "text to be code:", text$
LET cd = LEN(text$)
IF text$ = "" THEN RETURN
q = 1
FOR i = 1 TO cd STEP 1
LET zm$ = MID$(text$, i, 1)
LET zmasc = ASC(zm$)
zmasc = zmasc + q
LET zmhy$ = CHR$(zmasc)
PRINT zmhy$;
q = q + 1
IF q = 4 THEN q = 1
NEXT i
NEXT x
RETURN


uncode: FOR x = 1 TO 2 STEP 0
PRINT
INPUT "text to be uncode:", text$
LET cd = LEN(text$)
IF text$ = "" THEN RETURN
q = 1
FOR i = 1 TO cd STEP 1
LET zm$ = MID$(text$, i, 1)
LET zmasc = ASC(zm$)
zmasc = zmasc - q
LET zmhy$ = CHR$(zmasc)
PRINT zmhy$;
q = q + 1
IF q = 4 THEN q = 1
NEXT i
NEXT x
RETURN

4 楼

def说得很对。
其实完全可以用sub解决,而且更好,只是当时对模块的认识不深刻,又刚从basic转用qbasic,有点惯性。[em12]

5 楼

哈哈,我名白原理泐,就是 ASCII码+位置(过3字符就变1)
inp:ccc
out:def
    ^^^
    123
inp:(ascii=255)
out:Illegal function call(error=5)[em6]
另外,这是子程,你怎么说是模块?
子程=xxx(调用)/ sub xxx(开始)/ end sub(结束)/ exit sub(返回)
     gosub xxx(调用)/ xxx:(开始)/ return(返回)' 老BASIC也有,'xxx:'应该为行号
函数=s=xxx(调用)/ function xxx(开始)/ end function(结束)/ exit function(返回)
     s=fnxxx(调用)/ def fnxxx(开始)/ end def(结束)/ exit def(返回)
     s=fnxxx(调用)/ def fnxxx=xxx(开始)' 老BASIC也有
模块=一个bas文件

6 楼

口误,好久没用“术语”了。程序你修改之后好看多了。
至于过三个字符就变一轮只是个实例,当然可以(kN+b)个字符是一轮,
N可由键盘指定,但是k和b就可以不让操作者知道,甚至可以随机,只要在返回的字符串中加入与k和b一一对应的片断,解密时程序先读该段字符以确定解密算法(就是密钥),这样没人能知道是按什么规律加密的,而且解密时密钥自动进入锁孔。更方便的是,即使你能得知哪段字符存储密钥信息,也不能算出密钥,因为密钥本身是被自己加密的。这就完全封闭了手工蛮力破解法(如果使用密码,在一段理论上“很长”的时间内,总能得到正确的密码,而这段很长的时间,可以通过增加破解人数的方法而成倍地缩短)。
甚至,可以用更复杂的函数处理键盘输入的N值(如三次函数aN^3+bN^2+cN+d)。
我把这个想法说出来,就是希望大家都能帮我修饰一下程序,这是几年前写的了,当时还是新手,肯定有能修缮的地方,但是思路绝对是原创,这是我看一本介绍信息加密的书时想到的,好像那书是说PGP的,记不清了。

还有一点,我遇到了一个技术障碍:
为了完全杜绝加密者知道密钥的可能性,我准备用“单向函数”处理键盘输入的N值。
所谓单向函数,是数学里一类特殊的函数,你给定自变量,能得到唯一确定的函数值,但通过函数值,却找不到准确的自变量。乍看之下,好像所有的不单调的函数都有这样的特征,但是此处却需要同一个函数值对应的自变量有无限个,而且分布没有规律(原因很简单,还是预防暴力破解),最近这几天突然发现QB中的“求余函数( mod 函数)”很符合要求,比如你知道22除以7的余数是1,但是知道函数值1和常数7,想求是那个数除得的,却不可能^_^.问题就是把这个函数真正用进程序里的方式了,希望大家群策群力,在这里先谢过了。我觉得写的好的话,这是一个非常有价值的程序,可以取代密码加密法。

7 楼

但人们可以破。。。
用自己发明的1GB内存、P6处理器、1TB硬盘、特别的操作系统,浏览器。。。(^_^)

我来回复

您尚未登录,请登录后再回复。点此登录或注册