【问题标题】:Is there an AES library for clojure?是否有用于 clojure 的 AES 库?
【发布时间】:2012-04-19 03:28:30
【问题描述】:

clojure 有 AES 加密库吗?我应该使用通过 maven 或 clojars 提供的 java 库吗?感谢您的时间和考虑。

【问题讨论】:

    标签: encryption clojure


    【解决方案1】:

    这是一个使用可用的 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"
    

    【讨论】:

    【解决方案2】:

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

    请参阅Java 256-bit AES Password-Based Encryption,了解有关 Java API 的详细讨论。此外,http://jyliao.blogspot.com/2010/08/exploring-java-aes-encryption-algorithm.html 有一个使用 Clojure 的 API 的示例(尽管那里的代码并不完全符合地道)。

    【讨论】:

      【解决方案3】:

      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)
      

      【讨论】:

        【解决方案4】:

        加密库Clojure-AES 完全用 Clojure 编写。唯一依赖于 Clojure 1.10(截至 2021 年 11 月),它不使用任何基于 Java 的库。随意尝试一下。它是直接从original NIST specification 编码的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多