【发布时间】:2021-04-24 06:09:57
【问题描述】:
我正在开发一个使用 Vigenère 密码加密/解密数据的程序。除了解密部分,一切都很好。
加密和计算密钥背后的逻辑是:
-
输入:“qwerty”
-
Key : "asd" = 计算出来的键是 "asdasd"
-
密码:“catdxn”
-
我使用以下算法进行加密:
-
结果[i] = (INPUT[i]+key[i]) % 26
-
结果[i] += 3dH ;转换为ASCII码
-
密码[i] += 结果[i] 问题在于解密:
解密算法应该是
-
结果[i] = (INPUT[i] - KEY[i]) % 26
-
IN CASE INPUT[i] - KEY[i] = NEGATIVE NUMBER = 加 26 所以公式变为
-
结果[i] = (INPUT[i] - KEY[i] + 26) % 26
-
结果[i] += 3dH
-
密码[i] += 结果[i] ;获取结果字符串
预期的结果应该是“qwerty”,但我得到的是“usgtrm”。
所以按照上面描述的算法,我有以下代码:
;inputKey = KEY,
;inputWORD = Input,
;cipherText = Result
;inputWORDLENGTH = length of input = CX
XOR DI,DI
vigDECLOOP:
cmp di,cx
JNB DONELOOPDEC
PUSH CX
mov si, offset inputWORD
ADD SI,DI
XOR DX,DX
MOV DL, DS:[SI] ; DL = INPUT[I]
xor SI,SI
MOV SI, OFFSET inputKEY
ADD SI, DI
XOR CX,CX
MOV CL, DS:[SI] ; CL = KEY[I]
SUB DL, CL
; ========
; Here in case is negative number I somehow need to add 26 to DL (result of DIV )
; IT 2: 61- 73 = EE in DL and should be -18, I know is something about the signed bit
; but I dont know what to read and where about this.
; ========
mov ax, cx ; Store in AX the result of subtracting
mov bx, 26 ; add in bx 26
div bx ; To obtain the reminder from % 26
; ========
; ========
add dl, 3Dh ; add 3dH to DL(reminder of DIV) to get the asci
xor si,si
mov si, offset cipherText
add si,di
xor dh,dh
add dl, DS:[si]
mov DS:[si],dl
INC DI
POP CX
jmp vigDECLOOP
DONELOOPDEC:
RET
问题在于减法,我对这个问题完全不熟悉。 让我们说“catdxn”这个词。 63、61、74、64、78、6E 和 'asdasd' 键 61, 73, 64, 61, 73, 64 在第二次迭代中,我们有 61 - 73 (SUB DL, CL) = 结果是 FFFF FFFF FFFF FFEE 或 - 18。 发生这种情况时,我需要将 26 添加到结果中,但我无法理解: SUB DL, CL STORES IN DL = EE 的结果这是十进制的 238,如何添加十进制的 26 或 (1A Hex) 到一个正数......它应该是'61h - 73h = -18d + 26d 或 1Ah = 8'。可能真的错了。
【问题讨论】:
-
您的算法可能打算使用字母,而不是 ascii 代码。
-
不知何故,您设法得出结论,18446744073709551598 =
0xFFFFFFFFFFFFFFEE与-18相同。使用相同的思路得出结论0xEE与-18相同。
标签: assembly encryption x86-16 subtraction emu8086