Clojure是否有AES库?

9

是否有适用于Clojure的AES加密库?我应该使用通过Maven或Clojars可用的Java库吗?感谢您的时间和考虑。

4个回答

22

下面是一个使用Java加密库更为通俗易懂的示例。这里的encryptdecrypt仅接受文本输入和加密密钥(均为字符串类型)。

(import (javax.crypto Cipher KeyGenerator SecretKey)
        (javax.crypto.spec SecretKeySpec)
        (java.security SecureRandom)
        (org.apache.commons.codec.binary Base64))

(defn bytes [s]
  (.getBytes s "UTF-8"))

(defn base64 [b]
  (Base64/encodeBase64String b))

(defn debase64 [s]
  (Base64/decodeBase64 (bytes s)))

(defn get-raw-key [seed]
  (let [keygen (KeyGenerator/getInstance "AES")
        sr (SecureRandom/getInstance "SHA1PRNG")]
    (.setSeed sr (bytes seed))
    (.init keygen 128 sr)
    (.. keygen generateKey getEncoded)))

(defn get-cipher [mode seed]
  (let [key-spec (SecretKeySpec. (get-raw-key seed) "AES")
        cipher (Cipher/getInstance "AES")]
    (.init cipher mode key-spec)
    cipher))

(defn encrypt [text key]
  (let [bytes (bytes text)
        cipher (get-cipher Cipher/ENCRYPT_MODE key)]
    (base64 (.doFinal cipher bytes))))

(defn decrypt [text key]
  (let [cipher (get-cipher Cipher/DECRYPT_MODE key)]
    (String. (.doFinal cipher (debase64 text)))))

使用方式:

(def key "secret key")
(def encrypted (encrypt "My Secret" key)) ;; => "YsuYVJK+Q6E36WjNBeZZdg=="
(decrypt encrypted key) ;; => "My Secret"

1
有人将其打包为 https://github.com/clavoie/lock-key/blob/master/src/lock_key/core.clj - Paul Legato

7

0

加密库Clojure-AES完全使用Clojure编写。它仅依赖于Clojure 1.10(截至2021年11月),并且不使用任何基于Java的库。欢迎尝试。它是直接从原始NIST规范编码而来。

enter image description here


0

Tinklj 是一个很棒的库,它将 Clojure 封装在 Google Tink Java API 周围。Google Tink 支持使用流式或确定性加密/解密的所有形式。支持 AES AeadKeyTemplates.AES128_GCM。

它还提供了值得一试和参与的 MAC 和数字签名。

例如:

(:require [tinklj.keys.keyset-handle :as keyset-handles])

(keyset-handles/generate-new :aes128-gcm)

(:require [tinklj.encryption.aead :refer [encrypt decrypt])

(encrypt aead (.getBytes data-to-encrypt) aad)
(decrypt aead encrypted aad)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接