2013-08-18 25 views
1

Clojure是否有一個簡單的文本加密器,只需要一個密碼來解密?我只是希望像加密:Clojure有一個簡單的文本加密器,只需要一個密碼解密?

(encrypt "Some secret message" "Some secret key") 

:和解密:

(decrypt (encrypt "Some secret message" "Some secret key") "Some secret key") 

:將返回:

"Some secret message" 
+0

我認爲你的答案就在這裏:http://stackoverflow.com/questions/10221257/is-there- AN-AES-庫換的Clojure – noisesmith

回答

1

嘗試simple-crypto

[org.clojars.tnoda/simple-crypto "0.1.0"] 

它做的正是你想要的東西:

user=> (use 'org.clojars.tnoda.simple-crypto) 
user=> (decrypt (encrypt "Some secret message" "Some secret key!") "Some secret key!") 
"Some secret message" 
0

我不知道是做任何的Clojure庫大多數 - 我會說 - 因爲它太容易使用javax.crypto,javax.crypto.spec和java.security包。

可以在30行內完成。

3

我決定這個功能對我正在開發的一個項目很有幫助。

除了標準clojure,它還需要commons-codec。

project.clj

(defproject <project> "VERSION" 
    ... 
    :dependencies [[org.clojure/clojure "1.5.1"] 
       [commons-codec "1.8"]]) 

<project>/src/crypt.clj

(ns <whatever>.crypt 
    (:import (javax.crypto KeyGenerator SecretKey Cipher SecretKeyFactory) 
      (javax.crypto.spec SecretKeySpec PBEKeySpec) 
      (org.apache.commons.codec.binary Base64))) 

(def ^:dynamic *salt* "BIND SALT IN APP") 

(defn cipher- [] (. Cipher getInstance "AES")) 
(defn aes-keyspec [rawkey] (new SecretKeySpec rawkey "AES")) 

(defn encrypt- 
    [rawkey plaintext] 
    (let [cipher (cipher-) 
     mode (. Cipher ENCRYPT_MODE)] 
    (. cipher init mode (aes-keyspec rawkey)) 
    (. cipher doFinal (. plaintext getBytes)))) 

(defn decrypt- 
    [rawkey ciphertext] 
    (let [cipher (cipher-) 
     mode (. Cipher DECRYPT_MODE)] 
    (. cipher init mode (aes-keyspec rawkey)) 
    (new String(. cipher doFinal ciphertext)))) 

(defn passkey 
    [password & [iterations size]] 
    (let [keymaker (SecretKeyFactory/getInstance "PBKDF2WithHmacSHA1") 
     pass (.toCharArray password) 
     salt (.getBytes *salt*) 
     iterations (or iterations 1000) 
     size (or size 128) 
     keyspec (PBEKeySpec. pass salt iterations size)] 
    (-> keymaker (.generateSecret keyspec) .getEncoded))) 

(defn encrypt 
    [password plaintext] 
    (encrypt- (passkey password) plaintext)) 

(defn decrypt 
    [password cyphertext] 
    (decrypt- (passkey password) cyphertext)) 

用法:

(binding [crypt/*salt* "THE SALT WE ARE USING"] 
    (crypt/encrypt "password" "message") 
    (crypt/decrypt "password" *1))) 

如果你可以使用生成的密鑰,那將是更安全:

(defn aes-keygen [] (. KeyGenerator getInstance "AES")) 
(defn genkey 
    [keygen] 
    (. keygen init 128) 
    (. (. keygen generateKey) getEncoded)) 
(def generated (keygen aes-keygen)) 
(encrypt- generated plaintext) 
(decrypt- generated *1) 

這只是使用隨jvm提供的vanilla安全功能(commons-codec僅用於base-64編碼/解碼,因此我們可以對任意輸入進行操作,而不是安全設置的一部分)。