我正在寻找一种在Javascript中进行客户端加密的方法(记住http://www.matasano.com/articles/javascript-cryptography/)并找到了SJCL.但我似乎找不到好的代码示例.有什么指针吗?
我正在尝试在Ruby中实现aes-128-ccm加密字符串的SJCL解密.在阅读了类似的问题之后,我看到这应该在较新版本的OpenSSL库中得到支持,所以我已经将开发版本从github安装到/ opt
执行此操作后,当我运行/ opt/bin/openssl密码时,我在列表中看不到aes-128-ccm密码:
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:SRP-DSS-AES-256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:DH-DSS-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:DH-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DH-RSA-AES256-SHA256:DH-DSS-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DH-RSA-AES256-SHA:DH-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:DH-RSA-CAMELLIA256-SHA:DH-DSS-CAMELLIA256-SHA:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:SRP-DSS-3DES-EDE-CBC-SHA:SRP-RSA-3DES-EDE-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DH-RSA-DES-CBC3-SHA:DH-DSS-DES-CBC3-SHA:ECDH-RSA-DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:PSK-3DES-EDE-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:SRP-DSS-AES-128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:DH-DSS-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DH-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DH-RSA-AES128-SHA256:DH-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DH-RSA-AES128-SHA:DH-DSS-AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:DH-RSA-SEED-SHA:DH-DSS-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA:DH-RSA-CAMELLIA128-SHA:DH-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES128-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:IDEA-CBC-SHA:PSK-AES128-CBC-SHA:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:RC4-SHA:RC4-MD5:PSK-RC4-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DH-RSA-DES-CBC-SHA:DH-DSS-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DH-RSA-DES-CBC-SHA:EXP-DH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5
Run Code Online (Sandbox Code Playgroud)
但如果我运行/ opt/bin/openssl enc -help 2>&1我看到"-aes-128-ccm":
-aes-128-cbc -aes-128-ccm -aes-128-cfb
-aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr
-aes-128-ecb -aes-128-gcm -aes-128-ofb
-aes-128-xts -aes-192-cbc -aes-192-ccm
-aes-192-cfb -aes-192-cfb1 -aes-192-cfb8
-aes-192-ctr -aes-192-ecb -aes-192-gcm
-aes-192-ofb -aes-256-cbc -aes-256-ccm
-aes-256-cfb -aes-256-cfb1 -aes-256-cfb8
-aes-256-ctr -aes-256-ecb -aes-256-gcm
-aes-256-ofb -aes-256-xts -aes128
-aes192 -aes256 -bf
-bf-cbc -bf-cfb -bf-ecb
-bf-ofb -blowfish -camellia-128-cbc
-camellia-128-cfb -camellia-128-cfb1 -camellia-128-cfb8
-camellia-128-ecb -camellia-128-ofb -camellia-192-cbc
-camellia-192-cfb -camellia-192-cfb1 -camellia-192-cfb8
-camellia-192-ecb -camellia-192-ofb -camellia-256-cbc
-camellia-256-cfb -camellia-256-cfb1 -camellia-256-cfb8
-camellia-256-ecb -camellia-256-ofb -camellia128
-camellia192 -camellia256 -cast
-cast-cbc -cast5-cbc -cast5-cfb
-cast5-ecb -cast5-ofb -des
-des-cbc -des-cfb …Run Code Online (Sandbox Code Playgroud) 所述SJCL文档提供以下代码作为SHA256一个例子:
var bitArray = sjcl.hash.sha256.hash("message");
var digest_sha256 = sjcl.codec.hex.fromBits(bitArray);
Run Code Online (Sandbox Code Playgroud)
当我期待一个16个字符的十六进制字符串(256位= 16个十六进制字符)时,该示例中的摘要等于64个字符的十六进制字符串.我错过了什么?如何获得16个字符的哈希摘要?
我使用Stanford Javascript Crypto Library(SJCL)进行对称AES加密(基于其演示页面上的示例).但是,我还需要生成密钥对,使用公钥加密数据,并使用私钥解密数据.一些类名表明这可能在SJCL中有可能,但我想知道是否有人可以帮助一个如何完成它的例子.我不关心这个阶段的私钥存储,只是内存生成和使用公钥/私钥对.
如果不可能,我会对有关AES和公钥加密的替代库的建议感兴趣 - 但我知道这是我可以自己研究的东西!所以主要是我很想知道我开始使用的库是否可以满足我的所有需求,或者我是否需要寻找替代方案.
我正在尝试使用AES-256-CCM重现加密操作,该操作目前在Java中与Bouncy Castle提供商一起执行.当使用openssl在PHP中尝试相同的操作时,我找不到一组产生相同输出的参数.
由于最近将AEAD模式添加到PHP(7.1)中,因此文档的工作原理很少.
Java中"工作"加密的最小示例如下所示:
public static void main(String args[]) {
try {
java.security.Security.addProvider(new BouncyCastleProvider());
byte[] key = Base64.decodeBase64("Z4lAXU62WxDi46zSV67FeLj3hSK/th1Z73VD4/y6Eq4=".getBytes());
byte[] iv = Base64.decodeBase64("rcFcdcgZ3Q/A+uHW".getBytes());
SecretKey aesKey = new SecretKeySpec(key, 0, key.length, "AES");
Cipher aesCipher = Cipher.getInstance("AES/CCM/NoPadding", "BC");
aesCipher.init(1, aesKey, new IvParameterSpec(iv));
byte[] encrypted = aesCipher.doFinal("test".getBytes());
System.out.println(Hex.encodeHex(encrypted));
// Output: 411d89ff74205c106d8d85a8
}
catch (Throwable e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
当我试图使用不同的两个不同的库和语言重新生成它时,我已经将键和iv设置为已知值.
当尝试使用PHP和openssl重新生成它时,我正在尝试使用以下代码
$key = base64_decode("Z4lAXU62WxDi46zSV67FeLj3hSK/th1Z73VD4/y6Eq4=");
$iv = base64_decode('rcFcdcgZ3Q/A+uHW');
$data = 'test';
$tag = null;
$encrypted = openssl_encrypt($data,'aes-256-ccm', $key,OPENSSL_RAW_DATA, $iv, $tag,"",8);
echo(bin2hex($encrypted . $tag));
// d1a7403799b8c37240f36edb …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Web应用程序,它必须能够在服务器端使用ECC加密数据并在浏览器中解密.我发现在JS中唯一可以使用的库是SJCL.但是,由于目前SJCL中的ECC支持似乎有点放弃,我使用了fork,它具有密钥序列化支持和演示,以便于理解.
首先,我在JS中生成一个ECC密钥对:
keypair = sjcl.ecc.elGamal.generateKeys(384, 10);
document.writeln(JSON.stringify(keypair.pub.serialize()));
Run Code Online (Sandbox Code Playgroud)
这输出如下:
{"point":[1110230655,241884220,775655552,-849225963,-883815628,-1984298210,-736346431,1387519594,-1810604283,-1235638489,1333314084,-1219216530,614640565,-1148742381,1038670260,1013716131,758346573,1162278003,1232401864,-1948620456,533899535,-1478577959,1853846180,-1553049184],"curve":384}
Run Code Online (Sandbox Code Playgroud)
然后我尝试将此公钥转换为OpenSSL可理解的格式.
ar = [1110230655,241884220,775655552,-849225963,-883815628,-1984298210,-736346431,1387519594,-1810604283,-1235638489,1333314084,-1219216530,614640565,-1148742381,1038670260,1013716131,758346573,1162278003,1232401864,-1948620456,533899535,-1478577959,1853846180,-1553049184]
# ugly bit magic to somehow convert the above array into a proper byte array (in form of a string)
kstr = [(ar.map { |i| (i>=0)?('0'*(8-i.to_s(16).length)+i.to_s(16)):("%08X" % (2**32-1+i+1)) }*'').upcase].pack("H*")
# opening a public key generated with the openssl cli tool showed a structure like this:
algokey = OpenSSL::ASN1::ObjectId 'id-ecPublicKey'
algovalue = OpenSSL::ASN1::ObjectId 'secp384r1'
algo = OpenSSL::ASN1::Sequence.new [algokey,algovalue]
# for some reason OpenSSL seems …Run Code Online (Sandbox Code Playgroud) 嗨,假设客户端有一个密钥不通过与加密数据相同的通道传输.
我想要完成的是在ruby中解密Stanford Javascript Crypto Library(sjcl)的结果.或者用于具有支持AES的加密库的任何其他语言的泛化.
这是我在javascript中所做的:
sjcl.encrypt('stack-password', 'overflow-secret')
Run Code Online (Sandbox Code Playgroud)
这就是我得到的回报:
{
"iv": "Tbn0mZxQcroWnq4g/Pm+Gg",
"v": 1,
"iter": 1000,
"ks": 128,
"ts": 64,
"mode": "ccm",
"adata": "",
"cipher": "aes",
"salt": "pMQh7m9Scds",
"ct": "H6JRpgSdEzKUw2qEO1+HwIzAdxGTgh0"
}
Run Code Online (Sandbox Code Playgroud)
所以我实际要问的是,我需要哪些参数(假设服务器已经有"stack-password"密钥)以便解密秘密服务器端,我应该使用哪个库?可能有AES解密库是不够的?
我正在评估WebCrypto性能与第三方加密库SJCL和Forge的比较.我希望WebCrypto 更快,因为它是本机浏览器实现.这也已经过基准测试并且已经显示出来.
我使用Benchmark.js实现了以下测试来测试密钥派生(PBKDF2-SHA256),加密(AES-CBC)和解密(AES-CBC).这些测试显示web加密速度明显慢于SJCL和Forge加密/解密.
请看这里的小提琴:https://jsfiddle.net/kspearrin/1Lzvpzkz/
var iterations = 5000;
var keySize = 256;
sjcl.beware['CBC mode is dangerous because it doesn\'t protect message integrity.']();
// =========================================================
// Precomputed enc values for decrypt benchmarks
// =========================================================
var encIv = 'FX7Y3pYmcLIQt6WrKc62jA==';
var encCt = 'EDlxtzpEOfGIAIa8PkCQmA==';
// =========================================================
// Precomputed keys for benchmarks
// =========================================================
function sjclMakeKey() {
return sjcl.misc.pbkdf2('mypassword', 'a salt', iterations, keySize, null);
}
var sjclKey = sjclMakeKey();
function forgeMakeKey() …Run Code Online (Sandbox Code Playgroud) 我需要在用户浏览器中生成一个安全的50个字符的随机字符串.
看看sjcl.prng到目前为止我有这个:
$(document).ready(function () {
sjcl.random = new sjcl.prng(8);
sjcl.random.startCollectors();
$("body").on('mousemove', function() {
console.log(sjcl.random.getProgress(8));
if(sjcl.random.isReady(8) === 2) {
sjcl.random.stopCollectors();
console.log(sjcl.random.randomWords(5,8));
}
});
});
Run Code Online (Sandbox Code Playgroud)
将鼠标移动一段时间后,我得到一个像这样的字节数组:[-579285364, 1099191484, 94979086, -1572161987, -570940948].
但我正在寻找的是一个50个字符的字母数字字符串.我对这个主题的了解有限,我在这里寻求帮助.
sjcl ×10
javascript ×8
encryption ×4
aes ×3
cryptography ×3
ruby ×3
openssl ×2
benchmark.js ×1
bouncycastle ×1
cryptojs ×1
hex ×1
php ×1
php-openssl ×1
prng ×1
random ×1
rsa ×1