为什么不铁板钉钉:按预期解密到位的工作



代码如下:

(ql:quickload :ironclad)
(ql:quickload :crypto-shortcuts)
(use-package :ironclad)
(defparameter str "Hello World!")
(defparameter message (ascii-string-to-byte-array str))
(defparameter key "1234")
(let ((cipher (make-cipher :arcfour
:key (ascii-string-to-byte-array key)
:mode :stream
:initialization-vector (make-random-salt)))
(text
(ascii-string-to-byte-array
(cryptos:to-base64 (copy-seq message)))))
;; #(83 71 86 115 98 71 56 103 86 50 57 121 98 71 81 104)
(format t "~a~%" text)
(encrypt-in-place cipher text)
;; #(86 14 39 220 145 171 63 106 89 41 57 41 135 32 85 188)
;; "Vg4n3JGrP2pZKTkphyBVvA=="
(format t "~a~%" text)
(format t "~a~%" (cryptos:to-base64 text))
(decrypt-in-place cipher text)
;; ?
;; #(83 71 86 115 98 71 56 103 86 50 57 121 98 71 81 104)
(format t "~a~%" text))

我的代码出了什么问题?

(decrypt-in-place cipher text)之后,text应该与原来的相同,但事实并非如此。为什么?

有人能帮忙吗?

以下是加密快捷方式版本:

(cryptos:decrypt (cryptos:encrypt str
key                                  
:cipher :arcfour
:mode :stream)
key
:cipher :arcfour
:mode :stream)

一切都好。

根据我的理解,密码arcfourIronclad中的算法是累积的:在算法的每一步,内部结果都在变化。

在这里,您可以将encryption的结果重用到decryption中。此时,密码的内部状态是未正确初始化,其值是上次加密的结果。

为了正常工作,decryption密码需要以与encryption密码相同的方式进行初始化。

最简单的方法是创建两个cipher:实例

(let* ((salt (make-random-salt))
(cipher-encrypt (make-cipher :arcfour
:key (ascii-string-to-byte-array key)
:mode :stream
:initialization-vector salt))
(cipher-decrypt (make-cipher :arcfour
:key (ascii-string-to-byte-array key)
:mode :stream
:initialization-vector salt))
(text
(ascii-string-to-byte-array
(cryptos:to-base64 (copy-seq message)))))
;; #(83 71 86 115 98 71 56 103 86 50 57 121 98 71 81 104)
(format t "~a~%" text)
(encrypt-in-place cipher-encrypt text)
;; #(86 14 39 220 145 171 63 106 89 41 57 41 135 32 85 188)
;; "Vg4n3JGrP2pZKTkphyBVvA=="
(format t "~a~%" text)
(format t "~a~%" (cryptos:to-base64 text))
(decrypt-in-place cipher-decrypt text)
;; ?
;; #(83 71 86 115 98 71 56 103 86 50 57 121 98 71 81 104)
(format t "~a~%" text))
#(83 71 86 115 98 71 56 103 86 50 57 121 98 71 81 104)
#(86 14 39 220 145 171 63 106 89 41 57 41 135 32 85 188)
Vg4n3JGrP2pZKTkphyBVvA==
#(83 71 86 115 98 71 56 103 86 50 57 121 98 71 81 104)

最新更新