encryption - qbasic 中的维吉尼亚加密

标签 encryption qbasic

如何在 Qbasic 中编写维吉尼亚加密而不使用数组?
我了解加密消息的数学原理:

Ca = Ma + Kb (mod 26)

并解密消息:

Ma = Ca – Kb (mod 26). 

我在语法上遇到了困难,因为我在网上没有找到太多信息。

最佳答案

您可以轻松解决此问题,无需使用任何数组。

下面是我的全 (Q)BASIC 解决方案。

MID$ 函数从字符串中提取一个字符,ASC 函数将该字符转换为其 ASCII 代码。减去 65 会产生 [0,25] 范围内的数字。使用 CHR$ 函数将加密的数字转回字符。此后,MID$ 语句用于将加密字符放回字符串中。
由于消息和加密 key 之间的长度不同,因此需要单独的迭代变量 (j%) 来重复遍历 key 字符串。

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)) 形式使用加法

发生这种情况是因为 TRUE 条件的计算结果为 -1。

  • 如果 a% > 25 为 TRUE,我们得到 (a% + 26 * -1) -> a% - 26<
  • 如果 a% > 25 为 FALSE,我们得到 (a% + 26 * 0) -> a%

关于encryption - qbasic 中的维吉尼亚加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58270766/

相关文章:

vb.net - 如何通过 vb.net 程序(自动)创建文件作为其他程序的输入?

javascript - 用于模糊/加密字符串的 native 选项?

python-3.x - 在python中使用 key 加密消息

c# - SSL 还是自己的实现?

qbasic - 使用 DO UNTIL LOOP 打印数组中的最小数字

qbasic - 老程序员的两个问题

cocoa - 如何使用这种加密方法将我的数据加密保存在核心数据中?

encryption - java.lang.IllegalArgumentException : bad base-64 when decrypting string

decompiler - 快速基本反编译