web-dev-qa-db-fra.com

Cryptage et décryptage de chaîne JavaScript?

Je suis intéressé par la création d'une petite application à usage personnel qui chiffrera et déchiffrera les informations côté client à l'aide de JavaScript. Les informations chiffrées seront stockées dans une base de données sur un serveur, mais jamais la version déchiffrée.

Il n’est pas nécessaire que ce soit ultra sécurisé, mais j’aimerais utiliser un algorithme ininterrompu.

Idéalement, je serais capable de faire quelque chose comme

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

pour générer la chaîne encodée, et quelque chose comme

var sensical = decrypt(gibberish, key);

pour le décoder plus tard.

Jusqu'à présent, j'ai vu ceci: http://bitwiseshiftleft.github.io/sjcl/

Y a-t-il d'autres bibliothèques à consulter?

115
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>
137
Tomas Kirda

Que diriez-vous de CryptoJS ?

C'est une solide bibliothèque de cryptographie, avec beaucoup de fonctionnalités. Il implémente les hashers, HMAC, PBKDF2 et les chiffrements. Dans ce cas, ciphers est ce dont vous avez besoin. Consultez le guide de démarrage rapide sur la page d'accueil du projet.

Vous pouvez faire quelque chose comme avec l'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>

En ce qui concerne la sécurité, au moment de mon écriture, l'algorithme AES est considéré comme ininterrompu

Modifier:

Apparemment, l'URL en ligne est en panne et vous pouvez utiliser les fichiers téléchargés pour le chiffrement à partir du lien ci-dessous, puis placez les fichiers correspondants dans votre dossier racine de l'application.

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

ou utilisé un autre CDN comme https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/aes-min.js

53
ovidb

J'ai créé un utilitaire de chiffrement/déchiffrement de texte simple. Aucune dépendance avec une bibliothèque externe.

Ce sont les fonctions

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('')
}

Et vous pouvez les utiliser comme suit:

// 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'
16
Jorgeblom

Les navigateurs modernes prennent désormais en charge l'API crypto.subtle, qui fournit des fonctions de cryptage et de décryptage natifs (async non moins!) À l'aide de l'une des méthodes suivantes: AES-CBC, AES-CTR, AES-GCM ou RSA-OAEP.

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

12
richardtallent

CryptoJS n'est plus pris en charge. Si vous souhaitez continuer à l'utiliser, vous pouvez passer à cette URL:

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

3

Fonctions simples,


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;
} 
1
Omi

Utilisez SimpleCrypto

Utilisation de encrypt () et decrypt ()

Pour utiliser SimpleCrypto, créez d'abord une instance SimpleCrypto avec une clé secrète (mot de passe). Le paramètre de clé secrète DOIT être défini lors de la création d'une instance SimpleCrypto.

Pour chiffrer et déchiffrer des données, utilisez simplement les fonctions encrypt () et decrypt () d'une instance. Cela utilisera l'algorithme de chiffrement 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