Qbasic中的Vigenère加密

时间:2019-10-07 13:39:36

标签: encryption qbasic

如何在不使用数组的情况下在Qbasic中编写Vigenère加密?
我了解加密消息的数学方法:

Ca = Ma + Kb (mod 26)

并解密消息:

Ma = Ca – Kb (mod 26). 

我在语法上苦苦挣扎,因为我在网上找不到太多信息。

2 个答案:

答案 0 :(得分:2)

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

下面是我的全(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$

连续运行两个代码片段会产生:

  

加密
  GYKERDGKZV
  加密


可以处理空格,标点符号和带重音符号的代码版本如何?

代码非常相似,甚至更简单:

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为假,我们得到(a% + 26 * 0)-> a%

答案 1 :(得分:1)

您可以简单地以数字形式获取char的ASCII值,然后减去A的字符值。您将得到一个范围为[0,26)的数字。然后,您将按照说明执行加密/解密。要获取有效的字符值,请反转并添加A的值。之所以有效,是因为以ASCII顺序列出了英文字母(ABC)。

要获取密文或纯文本,只需遍历字符串中的所有字符(可能在检查它是否不包含其他任何字符之后),然后将加密/解密的字符附加到新字符串中,最后返回该字符串。中提琴,没有数组,只有字符串,字符和数值。

那是所有人。