2

Clojure 用の単純なテキスト暗号化ツールで、暗号化を解除するのに 1 つのパスワードしか必要ないものはありますか? 暗号化するようなものが欲しいだけです:

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

:そして復号化するには:

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

:戻ります:

"Some secret message"
4

3 に答える 3

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 で提供されるバニラのセキュリティ機能のみを使用しています (commons-codec は base-64 エンコーディング/デコーディングに使用されるため、任意の入力を操作できます。セキュリティ設定の一部ではありません)。

于 2013-08-19T17:24:05.547 に答える
0

javax.crypto、javax.crypto.spec 、およびjava.securityパッケージ を使用すると簡単すぎるため、Clojureライブラリがほとんどそれを行っていることを知りません。

30行以内でできます。

于 2013-08-18T10:00:15.340 に答える