qbasic 中的 Vigenère 加密
Vigenère encryption in qbasic
如何在不使用数组的情况下在 Qbasic 中编写 Vigenère 加密?
我了解加密消息的数学原理:
Ca = Ma + Kb (mod 26)
并解密消息:
Ma = Ca – Kb (mod 26).
由于我在网上找不到太多信息,我正在为语法苦苦挣扎。
可以简单的获取char的ASCII值作为数字,然后减去A
的字符值。您会得到 [0, 26) 范围内的数字。然后你会按照你所说的那样执行加密/解密。要取回有效的字符值,然后反转并添加 A
的值。这是有效的,因为英文字母表 (ABC) 中的字母按 ASCII 的顺序列出。
要获得密文或明文,只需遍历字符串中的所有字符(可能在检查它不包含任何其他字符之后)并将加密/解密的字符附加到新字符串,最后 return那个。中提琴,没有数组,只有字符串、字符和数值。
这就是所有的人。
无需使用任何数组即可轻松解决此问题。
以下是我的全(Q)BASIC 解决方案。
MID$
函数从字符串中提取一个字符,ASC
函数将字符转换成它的ASCII码。减去 65 会产生 [0,25] 范围内的数字。使用 CHR$
函数将加密数字转回字符。此后 MID$
语句用于将加密字符放回字符串中。
由于消息和加密密钥之间的长度不同,因此需要一个单独的迭代变量 (j%
) 来重复遍历密钥字符串。
msg$ = "ENCRYPTION"
PRINT msg$
key$ = "CLINTON"
k% = LEN(key$)
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = (ASC(MID$(msg$, i%, 1)) - 65) + (ASC(MID$(key$, j%, 1)) -65)
MID$(msg$, i%) = CHR$(65 + a% + 26 * (a% > 25))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
上面的代码片段可以没有一个 - 65
和一个 + 65
,但为了清楚起见,我将它们保留了下来。
解密过程非常相似。只需 3 个小改动:
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = (ASC(MID$(msg$, i%, 1)) - 65) - (ASC(MID$(key$, j%, 1)) -65)
MID$(msg$, i%) = CHR$(65 + a% - 26 * (a% < 0))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
运行 两个片段连续产生:
ENCRYPTION
GYKERDGKZV
ENCRYPTION
可以处理空格、标点符号和重音字符的代码版本怎么样?
代码非常相似,甚至更简单:
msg$ = "This is any text that needs encrypting. So sayeth Sep Roland!"
PRINT msg$
key$ = "Blaise de Vigenère"
k% = LEN(key$)
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = ASC(MID$(msg$, i%, 1)) + ASC(MID$(key$, j%, 1))
MID$(msg$, i%) = CHR$(a% + 256 * (a% > 255))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = ASC(MID$(msg$, i%, 1)) - ASC(MID$(key$, j%, 1))
MID$(msg$, i%) = CHR$(a% - 256 * (a% < 0))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
我不会在此处复制任何输出,因为那将是真正的皮塔饼...
这些奇怪的嵌入条件是否正确?
(a% + 26 * (a% > 25))
考虑等效的简单代码:
IF a% > 25 THEN
a% = a% - 26
ENDIF
如果a%
变量大于25,我们需要减去26。
尽管如此 (a% + 26 * (a% > 25))
形式使用 addition.
之所以会这样,是因为 TRUE 条件的计算结果为 -1。
- 如果
a% > 25
为真,我们得到 (a% + 26 * -1)
-> a% - 26
- 如果
a% > 25
为假,我们得到 (a% + 26 * 0)
-> a%
如何在不使用数组的情况下在 Qbasic 中编写 Vigenère 加密?
我了解加密消息的数学原理:
Ca = Ma + Kb (mod 26)
并解密消息:
Ma = Ca – Kb (mod 26).
由于我在网上找不到太多信息,我正在为语法苦苦挣扎。
可以简单的获取char的ASCII值作为数字,然后减去A
的字符值。您会得到 [0, 26) 范围内的数字。然后你会按照你所说的那样执行加密/解密。要取回有效的字符值,然后反转并添加 A
的值。这是有效的,因为英文字母表 (ABC) 中的字母按 ASCII 的顺序列出。
要获得密文或明文,只需遍历字符串中的所有字符(可能在检查它不包含任何其他字符之后)并将加密/解密的字符附加到新字符串,最后 return那个。中提琴,没有数组,只有字符串、字符和数值。
这就是所有的人。
无需使用任何数组即可轻松解决此问题。
以下是我的全(Q)BASIC 解决方案。
MID$
函数从字符串中提取一个字符,ASC
函数将字符转换成它的ASCII码。减去 65 会产生 [0,25] 范围内的数字。使用 CHR$
函数将加密数字转回字符。此后 MID$
语句用于将加密字符放回字符串中。
由于消息和加密密钥之间的长度不同,因此需要一个单独的迭代变量 (j%
) 来重复遍历密钥字符串。
msg$ = "ENCRYPTION"
PRINT msg$
key$ = "CLINTON"
k% = LEN(key$)
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = (ASC(MID$(msg$, i%, 1)) - 65) + (ASC(MID$(key$, j%, 1)) -65)
MID$(msg$, i%) = CHR$(65 + a% + 26 * (a% > 25))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
上面的代码片段可以没有一个 - 65
和一个 + 65
,但为了清楚起见,我将它们保留了下来。
解密过程非常相似。只需 3 个小改动:
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = (ASC(MID$(msg$, i%, 1)) - 65) - (ASC(MID$(key$, j%, 1)) -65)
MID$(msg$, i%) = CHR$(65 + a% - 26 * (a% < 0))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
运行 两个片段连续产生:
ENCRYPTION
GYKERDGKZV
ENCRYPTION
可以处理空格、标点符号和重音字符的代码版本怎么样?
代码非常相似,甚至更简单:
msg$ = "This is any text that needs encrypting. So sayeth Sep Roland!"
PRINT msg$
key$ = "Blaise de Vigenère"
k% = LEN(key$)
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = ASC(MID$(msg$, i%, 1)) + ASC(MID$(key$, j%, 1))
MID$(msg$, i%) = CHR$(a% + 256 * (a% > 255))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = ASC(MID$(msg$, i%, 1)) - ASC(MID$(key$, j%, 1))
MID$(msg$, i%) = CHR$(a% - 256 * (a% < 0))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
我不会在此处复制任何输出,因为那将是真正的皮塔饼...
这些奇怪的嵌入条件是否正确?
(a% + 26 * (a% > 25))
考虑等效的简单代码:
IF a% > 25 THEN
a% = a% - 26
ENDIF
如果a%
变量大于25,我们需要减去26。
尽管如此 (a% + 26 * (a% > 25))
形式使用 addition.
之所以会这样,是因为 TRUE 条件的计算结果为 -1。
- 如果
a% > 25
为真,我们得到(a% + 26 * -1)
->a% - 26
- 如果
a% > 25
为假,我们得到(a% + 26 * 0)
->a%