web-dev-qa-db-ja.com

JavaScript文字列の暗号化と復号化

私は、JavaScriptを使用してクライアント側で情報を暗号化および復号化する個人用の小さなアプリケーションを作成することに興味があります。暗号化された情報はサーバー上のデータベースに格納されますが、復号化されたバージョンは格納されません。

非常に安全である必要はありませんが、現在切れ目のないアルゴリズムを使用したいと思います。

理想的には、次のようなことができると思います。

var gibberish = encrypt(string, salt, key);

エンコードされた文字列を生成する

var sensical = decrypt(gibberish, key);

後でそれをデコードします。

これまでのところ私はこれを見ました: http://bitwiseshiftleft.github.io/sjcl/

私が見るべき他のライブラリはありますか?

106
jeremiahs
 var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
//U2FsdGVkX18ZUVvShFSES21qHsQEqZXMxQ9zgHy+bu0=

var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
//4d657373616765


document.getElementById("demo1").innerHTML = encrypted;
document.getElementById("demo2").innerHTML = decrypted;
document.getElementById("demo3").innerHTML = decrypted.toString(CryptoJS.enc.Utf8);
Full working sample actually is:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>

<br><br>
<label>encrypted</label>
<div id="demo1"></div>
<br>

<label>decrypted</label>
<div id="demo2"></div>

<br>
<label>Actual Message</label>
<div id="demo3"></div>
130
Tomas Kirda

CryptoJS はどうですか?

それは多くの機能を備えたしっかりした暗号ライブラリです。ハッシュ、HMAC、PBKDF2、および暗号を実装しています。この場合、暗号が必要です。プロジェクトのホームページでクイックスタートの成果をチェックしてください。

AESを使って、次のようなことができます。

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>

<script>
    var encryptedAES = CryptoJS.AES.encrypt("Message", "My Secret Passphrase");
    var decryptedBytes = CryptoJS.AES.decrypt(encryptedAES, "My Secret Passphrase");
    var plaintext = decryptedBytes.toString(CryptoJS.enc.Utf8);
</script>

セキュリティに関しては、私が書いている時点ではAESアルゴリズムは壊れていないと考えられています

編集:

オンラインURLがダウンしているようだ&あなたは与えられたリンクの下から暗号化のためにダウンロードしたファイルを使用することができます&アプリケーションのあなたのルートフォルダにそれぞれのファイルを配置します。

https://code.google.com/archive/p/crypto-js/downloads

または https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js のような他のCDNを使用しました==

48
ovidb

私は簡単なテキスト暗号化/復号化utilを作成しました。外部ライブラリとの依存関係はありません。

これらは機能です

let cipher = salt => {
    let textToChars = text => text.split('').map(c => c.charCodeAt(0))
    let byteHex = n => ("0" + Number(n).toString(16)).substr(-2)
    let applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code)    

    return text => text.split('')
        .map(textToChars)
        .map(applySaltToChar)
        .map(byteHex)
        .join('')
}

let decipher = salt => {
    let textToChars = text => text.split('').map(c => c.charCodeAt(0))
    let saltChars = textToChars(salt)
    let applySaltToChar = code => textToChars(salt).reduce((a,b) => a ^ b, code)
    return encoded => encoded.match(/.{1,2}/g)
        .map(hex => parseInt(hex, 16))
        .map(applySaltToChar)
        .map(charCode => String.fromCharCode(charCode))
        .join('')
}

そして、あなたは以下のようにそれらを使うことができます:

// To create a cipher
let myCipher = cipher('mySecretSalt')

//Then cipher any text:
myCipher('the secret string')   // --> "7c606d287b6d6b7a6d7c287b7c7a61666f"

//To decipher, you need to create a decipher and use it:
let myDecipher = decipher('mySecretSalt')
myDecipher("7c606d287b6d6b7a6d7c287b7c7a61666f")    // --> 'the secret string'
12
Jorgeblom

最近のブラウザは現在、crypto.subtle APIをサポートしています。これは、AES-CBC、AES-CTR、AES-GCM、またはRSA-OAEPのいずれかの方法を使用して、ネイティブの暗号化および復号化機能を提供します。

https://www.w3.org/TR/WebCryptoAPI/#dfn-Crypto

10
richardtallent

CryptoJSはサポートされなくなりました。使い続けたい場合は、次のURLに切り替えてください。

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>

3

SimpleCrypto を使う

encrypt()およびdecrypt()を使用する

SimpleCryptoを使用するには、まず秘密鍵(パスワード)を指定してSimpleCryptoインスタンスを作成します。 SimpleCryptoインスタンスを作成するときに秘密鍵パラメータを定義しなければなりません。

データを暗号化および復号化するには、単にインスタンスからencrypt()およびdecrypt()関数を使用します。これはAES-CBC暗号化アルゴリズムを使用します。

var _secretKey = "some-unique-key";

var simpleCrypto = new SimpleCrypto(_secretKey);

var plainText = "Hello World!";
var chiperText = simpleCrypto.encrypt(plainText);
console.log("Encryption process...");
console.log("Plain Text    : " + plainText);
console.log("Cipher Text   : " + cipherText);
var decipherText = simpleCrypto.decrypt(cipherText);
console.log("... and then decryption...");
console.log("Decipher Text : " + decipherText);
console.log("... done.");
0
Murtaza Hussain

簡単な機能


function Encrypt(value) 
{
  var result="";
  for(i=0;i<value.length;i++)
  {
    if(i<value.length-1)
    {
        result+=value.charCodeAt(i)+10;
        result+="-";
    }
    else
    {
        result+=value.charCodeAt(i)+10;
    }
  }
  return result;
}
function Decrypt(value)
{
  var result="";
  var array = value.split("-");

  for(i=0;i<array.length;i++)
  {
    result+=String.fromCharCode(array[i]-10);
  }
  return result;
} 
0
Omi