clojure 用の AES 暗号化ライブラリはありますか? Maven または clojars から入手できる Java ライブラリを使用する必要がありますか? お時間を割いていただき、ありがとうございます。
4126 次
4 に答える
21
これは、利用可能な 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"
于 2013-02-11T23:27:08.487 に答える
7
Java の AES 実装は十分にテストされており、JDK に含まれています。Clojure ライブラリは、その impl 自体を使用する可能性があります。
Java API の適切な説明については、Java 256 ビット AES パスワードベースの暗号化を参照してください。また、http://jyliao.blogspot.com/2010/08/exploring-java-aes-encryption-algorithm.htmlには、Clojure の API を使用した例があります (ただし、コードは完全に慣用的なものではありません)。
于 2012-04-19T04:24:36.097 に答える