Clojure是否有一个只需要一个密码即可解密的简单文本百科全书?
Clojure是否有一个只需要一个密码即可解密的简单文本百科全书?我只想加密一些东西:Clojure是否有一个只需要一个密码即可解密的简单文本百科全书?,clojure,Clojure,Clojure是否有一个只需要一个密码即可解密的简单文本百科全书?我只想加密一些东西: (encrypt "Some secret message" "Some secret key") :和要解密: (decrypt (encrypt "Some secret message" "Some secret key") "Some secret key") :将返回: "Some secret message" 我想说的是,我不知道有哪个Clojure库主要是这样做的,因为使用javax.c
(encrypt "Some secret message" "Some secret key")
:和要解密:
(decrypt (encrypt "Some secret message" "Some secret key") "Some secret key")
:将返回:
"Some secret message"
我想说的是,我不知道有哪个Clojure库主要是这样做的,因为使用javax.crypto、javax.crypto.spec和java.security包太容易了
可以在30行内完成。我不知道有任何Clojure库主要是这样做的——我可以说——因为使用javax.crypto、javax.crypto.spec和java.security包太容易了
可以在30行内完成。我觉得这个功能对我正在进行的项目很有帮助 除了标准clojure之外,它还需要commons编解码器
project.clj
:
(defproject <project> "VERSION"
...
:dependencies [[org.clojure/clojure "1.5.1"]
[commons-codec "1.8"]])
(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))
如果可以使用生成的密钥,则会更加安全:
(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提供的普通安全功能(commons codec仅用于base-64编码/解码,因此我们可以对任意输入进行操作,它不是安全设置的一部分)。我决定此功能将对我正在进行的项目有所帮助 除了标准clojure之外,它还需要commons编解码器
project.clj
:
(defproject <project> "VERSION"
...
:dependencies [[org.clojure/clojure "1.5.1"]
[commons-codec "1.8"]])
(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))
如果可以使用生成的密钥,则会更加安全:
(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提供的普通安全功能(commons codec仅用于base-64编码/解码,因此我们可以对任意输入进行操作,它不是安全设置的一部分)。尝试:
它可以完全满足您的需求:
user=> (use 'org.clojars.tnoda.simple-crypto)
user=> (decrypt (encrypt "Some secret message" "Some secret key!") "Some secret key!")
"Some secret message"
尝试:
它可以完全满足您的需求:
user=> (use 'org.clojars.tnoda.simple-crypto)
user=> (decrypt (encrypt "Some secret message" "Some secret key!") "Some secret key!")
"Some secret message"
我想你的答案在这里:我想你的答案在这里: