是否有针对clojure的AES库?

时间:2012-04-19 03:28:31

标签: encryption clojure

是否有针对clojure的AES加密库?我应该使用maven org clojars提供的java库吗?感谢您的时间和考虑。

3 个答案:

答案 0 :(得分:19)

这是使用可用的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 :(得分:7)

Java的AES实现已经过充分测试并包含在JDK中......任何Clojure库都可能会使用它本身。

有关Java API的正确讨论,请参阅Java 256-bit AES Password-Based Encryption。另外,http://jyliao.blogspot.com/2010/08/exploring-java-aes-encryption-algorithm.html有一个使用Clojure API的例子(虽然代码并不完全是惯用的。)

答案 2 :(得分:0)

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

它还提供了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)