Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure是否有一个只需要一个密码即可解密的简单文本百科全书?_Clojure - Fatal编程技术网

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

Clojure是否有一个只需要一个密码即可解密的简单文本百科全书?我只想加密一些东西:

(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"
我想你的答案在这里:我想你的答案在这里: