Вопрос по encryption – Есть ли библиотека AES для clojure?

9

Есть ли библиотека шифрования AES для clojure? я должен использовать Java-библиотеку, доступную через Maven или Clojars? Спасибо за ваше время и внимание.

Ваш Ответ

2   ответа
19

пожалуй, более идиоматичный пример использования доступных библиотек шифрования Java.encrypt а такжеdecrypt здесь каждый просто принимает входной текст и ключ шифрования, оба в виде строк.

(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"
7

иотека Clojure, вероятно, будет использовать это сам по себе.

Видеть Java 256-битное шифрование на основе пароля AES для приличного обсуждения Java API. Также,http: //jyliao.blogspot.com/2010/08/exploring-java-aes-encryption-algorithm.htm @ есть пример использования API от Clojure (хотя код там не совсем идиоматический).

Похожие вопросы