· 7 years ago · Nov 07, 2018, 01:56 AM
1function strToArrayBuffer(str) {
2 let buf = new ArrayBuffer(str.length * 2);
3 let bufView = new Uint16Array(buf);
4 for (let i = 0, strLen = str.length; i < strLen; i++) {
5 bufView[i] = str.charCodeAt(i);
6 }
7 return buf;
8 }
9
10 function arrayBufferToString(buf) {
11 return String.fromCharCode.apply(null, new Uint16Array(buf));
12 }
13
14 function arrayBufferToHex(buf) {
15 return Array.from(new Uint8Array(buf)).map(b => b.toString(16).padStart(2, "0")).join("");
16 }
17
18 let iv = window.crypto.getRandomValues(new Uint8Array(12));
19 console.log('nonce/iv: ' + arrayBufferToHex(iv));
20
21 let algoEncrypt = {
22 name: 'AES-GCM',
23 iv: iv,
24 tagLength: 128
25 };
26
27 let plainText =
28 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer imperdiet pretium leo, et auctor velit fermentum nec. Mauris eu finibus orci.";
29 console.log('Input Text: ' + plainText);
30
31 let secretKey = null;
32 window.crypto.subtle.generateKey(
33 {name: 'AES-GCM', length: 256},
34 true,
35 ['encrypt', 'decrypt']
36 ).then(function (key) {
37 secretKey = key;
38 return window.crypto.subtle.encrypt(algoEncrypt, key, strToArrayBuffer(plainText));
39 }).then(function (cipherText) {
40 console.log('Encrypted Hex:n' + arrayBufferToHex(cipherText));
41 return window.crypto.subtle.decrypt(algoEncrypt, secretKey, cipherText);
42 }).then(function (newPlainText) {
43 if (arrayBufferToString(newPlainText) == plainText) {
44 console.log("decryption matches");
45 } else {
46 console.log("decryption ERROR:" + arrayBufferToHex(newPlainText));
47 }
48 return window.crypto.subtle.exportKey("raw", secretKey);
49 }).then(function (keyData) {
50 console.log('Password Hex:n' + arrayBufferToHex(keyData));
51 }).catch(function (err) {
52 console.log('Error: ' + err.message);
53 });
54
55nonce/iv: b17eb886854af06d9d43d4d7
56
57Input Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer imperdiet pretium leo, et auctor velit fermentum nec. Mauris eu finibus orci.
58
59Encrypted Hex: facdbb0b024b059d0c78a2634bd6592c04feba0ecb833eee03c7e2c8135854d8ba5bcb80cac1ce8a1c7396fc684e4aa1a44c8b30e9bc800a033ff7ca1a7542a219c42208449232aa671e6443d92c87eca16fb4c06a61d965f455822d8131c26d8bfc6fdfbb5eaae7409516653f33a2c207affdd1539e29e65e236a232b98efc3056e69526115a71837d99f2235d92f6bc64b020e160f44d7281d307ab5cc33791d37bca8423d94f21bf4eccc1717a33891381cb116bbd8dc1f2ae953d94b00f4eef0bc237a7998d99a1a46b9581c34199aeda20cf68158cce43c8492370eccec55dc0f207a495d320aa7d7d8c3bf49c50726046b02ac6e9a9ce6d10d679ff07cff3462bdda051597f0ff5a1f6fb411be3048b72c2d7fe4242783d61d4115a576fcaae05016e6c4648d835b11
60
61decryption matches encrypt
62
63Password Hex:
64ce24825df74a15e84597a9446c4821e384661fb790281abec94eab4e5cd95b1b
65
66import sys
67import binascii
68import datetime
69import time
70
71from cryptography.hazmat.backends import default_backend
72from cryptography.hazmat.primitives.ciphers import (Cipher, algorithms, modes)
73from Cryptodome.Cipher import AES
74
75hexdata = "facdbb0b024b059d0c78a2634bd6592c04feba0ecb833eee03c7e2c8135854d8ba5bcb80cac1ce8a1c7396fc684e4aa1a44c8b30e9bc800a033ff7ca1a7542a219c42208449232aa671e6443d92c87eca16fb4c06a61d965f455822d8131c26d8bfc6fdfbb5eaae7409516653f33a2c207affdd1539e29e65e236a232b98efc3056e69526115a71837d99f2235d92f6bc64b020e160f44d7281d307ab5cc33791d37bca8423d94f21bf4eccc1717a33891381cb116bbd8dc1f2ae953d94b00f4eef0bc237a7998d99a1a46b9581c34199aeda20cf68158cce43c8492370eccec55dc0f207a495d320aa7d7d8c3bf49c50726046b02ac6e9a9ce6d10d679ff07cff3462bdda051597f0ff5a1f6fb411be3048b72c2d7fe4242783d61d4115a576fcaae05016e6c4648d835b11"
76noncehex = "b17eb886854af06d9d43d4d7"
77keyhex = "ce24825df74a15e84597a9446c4821e384661fb790281abec94eab4e5cd95b1b"
78
79nonce = binascii.unhexlify(noncehex)
80assert(len(nonce) == 12)
81
82key = binascii.unhexlify(keyhex)
83assert(len(key) == 32)
84
85binary = binascii.unhexlify(hexdata)
86
87cipher = Cipher(algorithms.AES(key), None, backend=default_backend())
88cipher.mode = modes.GCM(nonce)
89text = cipher.decryptor().update(binary)
90print(text)
91
92decryptor = AES.new(key=key, mode=AES.MODE_GCM, nonce=nonce)
93text = decryptor.decrypt(binary)
94print(text)
95
96%> ./pydecrypt.py
97Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer imperdiet pretium leo, et auctor velit fermentum nec. Mauris eu finibus orci.���7P��&���ջq�
98Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer imperdiet pretium leo, et auctor velit fermentum nec. Mauris eu finibus orci.���7P��&���ջq�