天道酬勤,学无止境

如何使用crypto-js库在客户端加密消息并在Java服务器解密(How to encrypt a message at client side using crypto-js library and decrypt it at the Java server)

问题

背景:我正在处理的应用程序应该可以脱机工作。 我有一个 HTML5 页面,用户键入的数据是使用 crypto-js 库加密的。 我希望将加密的消息发送到 java webserver,然后在服务器端对其进行解密。

我在做什么我能够使用 Crypto-js 加密消息

<code>
var message = "my message text";
var password = "user password";
var encrypted = CryptoJS.AES.encrypt( message ,password );
console.log(encrypted.toString());
// this prints an encrypted text "D0GBMGzxKXU757RKI8hDuQ=="
</code>

我想要做的是将加密文本“D0GBMGzxKXU757RKI8hDuQ==”传递给java服务器端代码并​​解密加密的消息。

我在java服务器端尝试了很多选项来解密crypto-js加密消息。 请在服务器端找到我的代码,该代码应该对加密文本进行解密。

<code>
public static String decrypt(String keyText,String encryptedText) 
{
// generate key 
Key key = new SecretKeySpec(keyText.getBytes(), "AES");
Cipher chiper = Cipher.getInstance("AES");
chiper.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedText);
byte[] decValue = chiper.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}  
</code>

我从下面的代码调用java方法解密

<code>
// performs decryption 
public static void main(String[] args) throws Exception 
{
String decryptedText = CrypterUtil.decrypt("user password","D0GBMGzxKXU757RKI8hDuQ==");
}
</code>

但是当我运行java解密代码时出现以下异常

<code>
Exception in thread "main" java.security.InvalidKeyException: Invalid AES key length: 13 bytes
at com.sun.crypto.provider.AESCipher.engineGetKeySize(AESCipher.java:372)
at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1052)
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1010)
at javax.crypto.Cipher.implInit(Cipher.java:786)
at javax.crypto.Cipher.chooseProvider(Cipher.java:849)
at javax.crypto.Cipher.init(Cipher.java:1213)
at javax.crypto.Cipher.init(Cipher.java:1153)
at au.gov.daff.pems.model.utils.CrypterUtil.decrypt(CrypterUtil.java:34)
at au.gov.daff.pems.model.utils.CrypterUtil.main(CrypterUtil.java:47)
Process exited with exit code 1.
</code>

不知道我做错了什么?...使用crypto-js 库加密消息的最佳方法是什么,以便它可以在其他地方使用用户输入的密码进行解密。

回答1

您必须了解密码不是密钥。 密码通常通过一些散列函数产生一个位串或字节数组,这是一个键。 它不能被打印,所以它被表示为十六进制或 base64。

在 JavaScript 中,您使用密码,但在 Java 中,您假设相同的密码是密钥,而实际上不是。 您可以确定 CryptoJS 如何散列密码以到达密钥并在 Java 中重新创建它,但它似乎是以这样一种方式实现的,每次使用密码加密某些东西时都会生成一个新的盐,并且没有办法换盐。

如果您真的想使用来自用户的密码,那么您需要自己导出密钥。 CryptoJS 为此提供了 PBKDF2,但它也需要加盐。 您可以为您的应用程序生成一个并将其添加到代码中。 你可以这样生成一次:

CryptoJS.lib.WordArray.random(128/8).toString();

每次将静态盐传递到基于密码的密钥派生函数时都派生密钥(此处为 AES-256)

var key = CryptoJS.PBKDF2(userPassword,
        CryptoJS.enc.Hex.parse(salt),
        { keySize: 256/32, iterations: 1000 });
var iv = CryptoJS.lib.WordArray.random(256/8); // random IV
var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

在服务器上,您需要将十六进制密钥字符串转换为字节数组。 您还需要将服务器上的方案从AES调整为AES/CBC/PKCS5Padding因为它是AES/CBC/PKCS5Padding中的默认设置。 注意 PKCS5 和 PKCS7 对于 AES 是相同的。

另请注意,您需要将 IV 从客户端传递到服务器并将其初始化为

chiper.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivBytes));

您当然可以使用 PBKDF 的 Java 实现从服务器上的密码和盐重新创建密钥,或者仅保存已知密码和盐的密钥。 您可以玩转 PBKDF 的迭代,什么是您的用户可以接受的。

回答2

感谢 Artjom B 和 Isaac Potoczny-Jones 的及时回复和建议。 为了他人的利益,我在下面给出了对我有用的完整解决方案。

Java代码在Java服务器端做cryptojs加密消息的解密

public static void main(String args[]) throws Exception{

    String password = "Secret Passphrase";
    String salt = "222f51f42e744981cf7ce4240eeffc3a";
    String iv = "2b69947b95f3a4bb422d1475b7dc90ea";
    String encrypted = "CQVXTPM2ecOuZk+9Oy7OyGJ1M6d9rW2D/00Bzn9lkkehNra65nRZUkiCgA3qlpzL";

    byte[] saltBytes = hexStringToByteArray(salt);
    byte[] ivBytes = hexStringToByteArray(iv);
    IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);        
    SecretKeySpec sKey = (SecretKeySpec) generateKeyFromPassword(password, saltBytes);
    System.out.println( decrypt( encrypted , sKey ,ivParameterSpec));
}

public static SecretKey generateKeyFromPassword(String password, byte[] saltBytes) throws GeneralSecurityException {

    KeySpec keySpec = new PBEKeySpec(password.toCharArray(), saltBytes, 100, 128);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    SecretKey secretKey = keyFactory.generateSecret(keySpec);

    return new SecretKeySpec(secretKey.getEncoded(), "AES");
}

public static byte[] hexStringToByteArray(String s) {

    int len = s.length();
    byte[] data = new byte[len / 2];

    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i+1), 16));
    }

    return data;
}

public static String decrypt(String encryptedData, SecretKeySpec sKey, IvParameterSpec ivParameterSpec) throws Exception { 

    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, sKey, ivParameterSpec);
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
    byte[] decValue = c.doFinal(decordedValue);
    String decryptedValue = new String(decValue);

    return decryptedValue;
}

可以在客户端进行加密和解密的cryptojs javascript代码

function  generateKey(){
    var salt = CryptoJS.lib.WordArray.random(128/8);
    var iv = CryptoJS.lib.WordArray.random(128/8);
    console.log('salt  '+ salt );
    console.log('iv  '+ iv );
    var key128Bits100Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32, iterations: 100 });
    console.log( 'key128Bits100Iterations '+ key128Bits100Iterations);
    var encrypted = CryptoJS.AES.encrypt("Message", key128Bits100Iterations, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7  });
}

function  decrypt(){
    var salt = CryptoJS.enc.Hex.parse("4acfedc7dc72a9003a0dd721d7642bde");
    var iv = CryptoJS.enc.Hex.parse("69135769514102d0eded589ff874cacd");
    var encrypted = "PU7jfTmkyvD71ZtISKFcUQ==";
    var key = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 128/32, iterations: 100 });
    console.log( 'key '+ key);
    var decrypt = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
    var ddd = decrypt.toString(CryptoJS.enc.Utf8); 
    console.log('ddd '+ddd);
}
回答3

AES 和相关算法可以以多种不同的方式使用,并且在混合语言时,找出客户端使用的模式并将它们与服务器的模式匹配总是有点棘手。

您的 Java 代码的第一个问题是您不能将字符串的字节用作 AES 密钥。 网上有很多人这样做的例子,但这是非常错误的。 就像与CryptoJS代码显示@ artjom-B,你需要使用“基于密码的密钥派生功能”,它需要可以精确地参数化的客户端和服务器上的相同。

此外,客户端需要生成盐并将其与加密文本一起发送; 否则,服务器无法从给定的密码生成相同的密钥。 我不确定 CryptoJS 究竟是如何做到这一点的,这在 Java 中是合理的,您可以在了解 cryptoJS 的工作原理时调整参数:

public static SecretKey generateKeyFromPassword(String password, byte[] salt) throws GeneralSecurityException {
    KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, 1000, 256);
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
    return new SecretKeySpec(keyBytes, "AES");
}

使用 AES CBC,您还需要随机生成一个 IV 并将其与加密文本一起发送。

所以总结一下:

  • 找出 CryptoJS 使用的 AES 参数。 不确定它们是什么,但听起来像:密钥大小(256)、填充(pkcs5)、模式(CBC)、PBE 算法(PBKDF2)、盐(随机)、迭代次数(100)
  • 使用相同的参数配置您的服务器
  • 使用 PBE 密钥生成器,以及非秘密(但随机)的盐
  • 使用带有非秘密(但随机)IV 的 AES CBC
  • 将密文、IV 和盐发送到服务器
  • 然后在服务器端,使用salt、迭代次数和密码生成AES密钥
  • 然后base64解码解密

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • crypto-js在使用密码加密消息时使用了哪些AES参数以及内部执行的步骤?(What are the AES parameters used and steps performed internally by crypto-js while encrypting a message with a password?)
    问题 背景:我正在处理的应用程序应该可以脱机工作。 我应该在Java服务器端使用密码作为密钥来加密一些文本数据。 加密的数据将传递到HTML5页面,并在客户端使用crypto-js库将服务器加密的数据解密。 我的问题:为了以某种方式加密我的消息,以便客户端可以使用crypt-js(使用用户输入的密码)解密消息,我需要知道crypto-js在加密消息时期望执行的确切步骤。 我需要知道的是:我有以下加密代码,该代码使用crypto-js在客户端对消息进行加密。 var message = "my message text"; var password = "user password"; var encrypted = CryptoJS.AES.encrypt( message ,password ); console.log(encrypted.toString()); 我在加密消息时需要知道CryptoJS使用的AES参数(不确定它们是什么,但听起来像是:密钥大小(256),填充(pkcs5),模式(CBC),PBE算法(PBKDF2),盐(随机),迭代次数(100) )。 如果有人可以确认这将是一个很大的帮助...最近几天我一直在努力解决这个谜团? 我需要知道CryptoJS在AES加密消息时执行的不同步骤 回答1 CryptoJS使用非标准的OpenSSL KDF进行密钥派生
  • CryptoJS中的AES加密和Coldfusion中的解密(AES Encrypt in CryptoJS and decrypt in Coldfusion)
    问题 我们有一个用Coldfusion9编写的静默登录服务,该服务接受来自外部系统的加密字符串,然后根据约定的算法/编码设置进行解密。 多年来,从运行ASP / JAVA / PHP的系统上这一直没有问题,但是我们现在有一个客户别无选择,只能使用CryptoJS来执行加密,对于我来说,我不知道为什么这样做不会在Coldfusion中解密。 我对加密的知识不是很出色,但是我要注意的是,每次执行加密时,针对完全相同的字符串/密钥的CryptoJS加密密文都会有所不同,而在Coldfusion / Java中,我始终可以期望完全相同的加密字符串。 我不确定这是否与编码相关,但是我以前从未遇到过接受任何其他系统的加密字符串的问题,因此我希望这是我在CryptoJS中加密的方式不正确。 <cfoutput> <!--- Set String and Key ---> <cfset theKey = toBase64("1234567812345678")> <cfset string = "max.brenner@google.com.au"> <!--- CryptoJS AES Libraries ---> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
  • 如何使用crypto-js解密AES ECB(How to decrypt AES ECB using crypto-js)
    问题 我正在尝试将加密数据从闪存(客户端)发送到服务器端的 javascript(在 asp 中作为 jscript 运行)。 有几个 javascript Aes 库,但它们几乎没有记录。 我正在尝试使用 crypto-js,但无法使代码正常工作。 下面的示例生成一个空输出,它应该生成“6bc1bee22e409f96e93d7e117393172a”。 <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body> <script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/rollups/aes.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/mode-ecb.js"></script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1/build/components/pad-nopadding.js"></script> <script> var key = CryptoJS.enc.Hex.parse(
  • Javascript AES加密(Javascript AES encryption [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 4年前关闭。 改善这个问题 是否有可用的Java AES 256位加密库? 回答1 JSAES是JavaScript中AES的强大实现。 http://point-at-infinity.org/jsaes/ 回答2 这是一个使用slowAES的演示页面。 slowAES易于使用。 合理设计。 合理的OO包装。 支持旋钮和控制杆,例如IV和加密模式。 与.NET / C#的良好兼容性。 这个名字是嘲讽的。 之所以称为“慢速AES”,是因为它不是在C ++中实现的。 但是在我的测试中,这并不算慢。 它缺少ECB模式。 我猜也缺少CTR模式,尽管您可以在ECB模式下轻松构建一个CTR模式。 它仅专注于加密。 Anandam提供了一个很好的补充类,该类使用Javascript执行符合RFC2898的基于密码的密钥派生。 这对库可与类似的.NET类一起很好地工作。 良好的互操作性。 但是,与SlowAES相比,Javascript PBKDF2在生成密钥时明显比Rfc2898DeriveBytes类慢。 从技术上讲,它具有良好的互操作性也就不足为奇了,但是对我而言,关键是SlowAES采用的模型是熟悉且易于使用的。
  • 服务器(Java - Cipher)和客户端(Javascript - CryptoJS)之间的 AES(AES between server (Java - Cipher) and client (Javascript - CryptoJS))
    问题 我必须在 JS 中创建一个应用程序,该应用程序使用 AES 对消息进行编码并通过 AJAX 将其传递给服务器。 然后服务器使用 Java 对消息进行解码。 我的问题是:如何在 JS 中加密消息并能够使用 AES 在 Java 中对其进行解密? 知道java和js之间的通信已经是通过webservices建立的 在客户端,我使用 Crypto JS 库 (http://code.google.com/p/crypto-js/)。 服务器端我使用 Java 提供的 Cipher 类(我使用 Java Play 框架,但在这里无关紧要)。 我对密码学完全陌生。 我已经研究了一整天,但仍然无法完成这项工作。 问题是用于加密和解密消息的密钥必须相同,我不知道如何做到这一点。 从我的搜索中,我了解到使用 AES 有不同的模式。 默认情况下,Java 使用 ECB,而 CryptoJS 使用 CBC,这是一个问题,但通过告诉 CryptoJS 也使用 ECB 模式似乎不难解决。 但是有一个填充问题,似乎 Java 和 CryptoJS 中唯一可用的填充根本没有填充。 但是当我在 Java 中使用 NoPadding 时出现异常。 但即使我设法解决了这个问题,最大的问题是 CryptoJS 生成的密钥和 Java 生成的密钥不一样。 如果我用 Java 加密消息,结果总是相同的
  • 使用高级加密标准算法 (AES) 在 Typescript 中加密字符串并在 C# 中解密(Encrypt the string In Typescript And Decrypt In C# using Advanced Encryption Standard Algorithm(AES))
    问题 我很难在 C# 中实现打字稿中的加密和解密。 在此处发布问题之前,我使用 Google 搜索并找到了一些链接,但这些链接与 JavaScript 而非打字稿相关。 使用 AES 算法在 javascript 中加密并在 C# 中解密 使用 angular2 中的 cryptojs 库加密文本 如何在 Angular 2 中导入非核心 npm 模块,例如(使用加密库)? 我按照上面的链接,在我当前的应用程序中实现加密/解密概念。 这是我在myservice.ts 中写的代码 //import { CryptoJS } from 'node_modules/crypto-js/crypto-js.js'; //import 'crypto-js'; import * as CryptoJS from 'crypto-js'; var key = CryptoJS.enc.Utf8.parse('7061737323313233'); var iv = CryptoJS.enc.Utf8.parse('7061737323313233'); var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("It works"), key, { keySize: 128 / 8, iv: iv, mode: CryptoJS
  • 使用CryptoJS加密并使用PHP解密(Encrypt with CryptoJS and decrypt with PHP)
    问题 在客户端(移动设备)上,我使用CryptoJS加密用户密码: var lib_crypt = require('aes'); $.loginButton.addEventListener('click', function(e){ var key = lib_crypt.CryptoJS.enc.Hex.parse('bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3'); var iv = lib_crypt.CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); var encrypted = lib_crypt.CryptoJS.AES.encrypt($.passwordInput.value, key, { iv: iv }); var password_base64 = encrypted.ciphertext.toString(lib_crypt.CryptoJS.enc.Base64); return password_base64; }); 在服务器端,我想使用mcrypt_decrypt对其解密: function decryptPassword($password) { $key = pack('H*',
  • 在浏览器中在 Node 和 CryptoJS 之间使用 AES 加密时出现的问题(Problems when using AES crypto between Node and CryptoJS in browser)
    问题 我想用 Node 加密一个字符串,然后在浏览器中用 CryptoJS 解密这个字符串。 加密: var crypto = require('crypto'); function encrypt(txt, cryptkey) { var cipher = crypto.createCipher('aes-256-cbc', cryptkey); var crypted = cipher.update(txt, 'utf8', 'hex'); crypted += cipher.final('hex'); return crypted; } encrypt('1', 'key'); // 83684beb6c8cf063caf45cb7fad04a50 包括: <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 解密: var decrypted = CryptoJS.AES.decrypt('83684beb6c8cf063caf45cb7fad04a50', 'key'); console.log(decrypted.toString(CryptoJS.enc.Utf8)); // empty string 实际结果是空字符串。
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥(CryptoJS encrypts AES with passphrase but PHP decrypt needs a key)
    问题 我正在使用 CryptoJS 来加密一个字符串: function doHash(msg){ msg = String(msg); var passphrase = 'aggourakia'; var hash = CryptoJS.AES.encrypt(msg, passphrase); var ciphertext= hash.ciphertext.toString(); //return ciphertext instead of object return ciphertext; } 据我了解,CryptoJS使用密码短语生成一个 key ,然后用于加密数据。 但是,我想使用 PHP 函数或这样的在线工具解密密码:http://aesencryption.net/ 问题是这些需要一个key ,而不是密码。 如何直接向 CryptoJS AES 提供密钥,我可以在服务器端或任何在线工具上使用它来解密? 问题是,我已经很难找到 PHP 函数来解密 AES 密码,而这个密码短语/密钥增加了复杂性 回答1 如果您想直接提供密钥,您也应该提供IV 。 需要 IV(初始化向量),以便它可以与消息的第一个块进行异或。 然后第一个块的密文与消息的第二个块进行异或运算,依此类推。 这称为密码块链接 (CBC)。 var key = CryptoJS.enc.Hex.parse(
  • javascript:隐藏键的内容(javascript: hiding contents of key)
    问题 在下面的代码中,我想隐藏浏览器控制台正在查看的键(扬声器)键的内容。 var App_Version = 1; var App_id = 35; var Speaker = "password"; 回答1 如果var Speaker = "password"; 在客户代码中的某处进行了硬编码,很不走运。 请参阅客户端上的密码加密,以及如何在纯Javascript HTML Web App中隐藏凭据,以及在客户端上是否值得对密码进行哈希处理,因为每个人都会说不要在客户端上隐藏/混淆密码。 但是,如果你真的,真的只是想从您的客户端代码完全删除密码,然后使用服务器端脚本来“代理”您的AJAX请求,并默默地为POST参数在运输过程中添加的密码(例如)到真正的目的地。 请参阅Angular REST API安全性 如果您坚持要在客户端使用某种加密,我会发现angularjs-crypto,它是“用于HTTP请求/响应中JSON的解密/加密的AngularJS模块”。 它基于crypto-js。 但是,我仍然坚决反对采用硬编码密码并在客户端对其进行加密。 回答2 好吧,您不能“隐藏” JavaScript。 您可以使用混淆器对其进行加密,但大多数人可以使用beautyfier对其进行解密。 但是检查一下: 混淆器 回答3 在Javascript中,没有隐藏变量内容而不取消设置变量的方法
  • Java 加密和 Javascript 解密 [关闭](Java Encryption and Javascript Decryption [closed])
    问题 关闭。 这个问题需要细节或清晰度。 它目前不接受答案。 想改善这个问题吗? 通过编辑此帖子添加详细信息并澄清问题。 6年前关闭。 改进这个问题 我正在尝试在 java 中加密数据并在 javascript 中解密相同的数据。 SO中已经有一个类似的问题,但它对我不起作用。 我的问题是 - Java 代码给出的加密文本没有被 Javascript 解密。 我在下面的 JS 中对加密文本和密钥进行了硬编码。 PS 我知道在 UI 上解密是没有用的,因为密钥是可见的,任何用户都可以解码代码。 但我这样做的要求是绕过渗透测试工具。 所以请建议如何做到这一点 Java代码—— import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class Crypt { private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[] { 'A', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'
  • Https的加密方式-非对称加密与对称加密
    1、对称加密: 对称加密算法:密钥只有一个,发送方和接收方都使用这个密钥对数据进行加密和解密,前提是要求解密方事先必须知道加密密钥。常用的对称加密算法有DES、AES(传统的DES由于只有56位密钥,已经不适应分布式开放网络对数据加密安全性的要求,AES是128位的加密强度是DES的1021倍多)。 优点:计算量小、加密速度快、加密效率高。 不足:安全性得不到保证,双方拥有的密钥越来越多。若这个密钥在互联网上传输就有可能被黑客截获。 2、非对称加密: 不对称加密算法:两把完全不同但完全匹配的一对公钥和私钥,私钥只有服务器有,而公钥可以发给所有的客户端。常用的不对称加密算法:RSA算法 问题:1、黑客可以用公钥解密服务器发送给客户端的信息,2、不对称加密算法效率低,速度慢。 3、服务器给客户发送公钥时可能被黑客截获,然后黑客把自己的公钥发给客户,导致客户一直用黑客的公钥加密并发消息给黑客。(如何得到公钥?) 3、非对称与对称加密相结合 为了解决加密算法的速度,第一次交换共享密钥时,使用非对称加密。然后用对称密钥加密信息报文。 问题:“服务器”要对外发布公钥,那“服务器”如何把公钥发送给“客户”呢?我们第一反应可能会想到以下的两个方法: a)把公钥放到互联网的某个地方的一个下载地址,事先给“客户”去下载。 b)每次和“客户”开始通信时,“服务器”把公钥发给“客户”。
  • 使用 Spring Web 服务客户端解密消息(Decrypting Message with a Spring Web Service Client)
    问题 350 赏金和华夫饼给可以帮助我的人! 几天来,我一直在努力使用 Spring Web 服务加密,但我不知道如何使 Spring 对消息正文的加密起作用。 每当我让服务器对生成的消息进行加密时,客户端似乎都不会在尝试根据架构 (XSD) 对其进行验证之前对其进行解密。 这是服务器端的配置 服务器的xwss安全配置 客户端的Spring配置 客户端的 xwss 配置 我能做的是加密用户令牌并成功解密。 我在从客户端向服务器发送数据时这样做。 然后服务器解密用户令牌并验证用户凭据,这非常有效。 如果我尝试加密返回的消息正文,则会出现问题。 问题发生在客户端。 客户端似乎在解密消息之前尝试验证消息,因此在针对架构进行验证时会发生错误。 [Fatal Error] :1:192: The prefix "ns0" for element "ns0:HolidayListResponse" is not bound. 11-Dec-2009 7:45:32 AM com.sun.xml.wss.impl.apachecrypto.DecryptionProcessor decryptElementWithCipher SEVERE: WSS1203: Exception [ The prefix "ns0" for element "ns0:HolidayListResponse"
  • 使用 SJCL 在 Javascript 中加密并在 PHP 中解密(Encrypt in Javascript with SJCL and decrypt in PHP)
    问题 我想用 Javascript 加密一些数据,然后将它发送到 php 服务器后就可以解密了。 我计划使用 JS 加密库作为 SJCL:http://crypto.stanford.edu/sjcl/。 到目前为止,我可以在 JS 中加密我的数据并通过 ajax post 发送它。 我的 JS 代码就像这样。 sjcl.encrypt('a_key','secured_message'); 我的问题是如何在 php 中解密我的数据。 如果可能的话,请用示例代码告诉我如何做到这一点。 (注意:SSL 不是我的选择,现在我打算使用 KEY 作为每个请求生成的随机数) 谢谢 回答1 PHP 7.1.0 最终为 iv 和 aad 参数添加了 openssl 支持,但它错误地强制执行了 12 字节的 iv 长度。 在您的示例中,我们加密如下: var sjcl = require('./sjcl'); console.log(sjcl.encrypt('a_key', 'secured_message', { mode: 'ccm', iv: sjcl.random.randomWords(3, 0) })); 要得到: {"iv":"YAKkgmNCcVawQtiB","v":1,"iter":10000,"ks":128,"ts":64,"mode":"ccm","adata":""
  • AES-256-CBC Mcrypt-PHP解密和Crypto-JS加密(AES-256-CBC Mcrypt-PHP decrypt and Crypto-JS Encrypt)
    问题 我正在尝试使用CryptoJS在Javascript中进行加密,并在PHP中进行解密。 JS代码是: var salt = CryptoJS.lib.WordArray.random(128/8); var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 }); var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); // just chosen for an example, usually random as well encrypted = CryptoJS.AES.encrypt("Message", key512Bits1000Iterations, { iv: iv }); var data_base64 = crypted.ciphertext.toString(CryptoJS.enc.Base64); var iv_base64 = crypted.iv.toString(CryptoJS.enc.Base64); var key_base64 = crypted.key.toString(CryptoJS.enc
  • crypto-js aes无法解密其加密的内容(crypto-js aes can't decrypt what it encrypted)
    问题 您好,我正在尝试使用crypto-js解密加密的aes字符串,但似乎无法正常工作。 我正在使用: <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> <script> var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase"); var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase"); </script> 但是我的结果是: encrypted: U2FsdGVkX19whKq54yOQt3l1erbtEtn/M0qJjAH+E/E= decrypted: 4d657373616765 我的期望是它返回“消息”。 我想念什么? 回答1 所有CryptoJS.<blockcipher>.decrypt()函数的返回类型都是CryptoJS.<blockcipher>.decrypt() ,它是WordArray中二进制数据的本机表示形式。 当您强制打印(自动调用toString() )时,它包含的二进制数据将被十六进制编码。 如果要使用其他编码,则需要指定它。 这里有些例子: console
  • Java和Java兼容的AES算法(Compatible AES algorithm for Java and Javascript)
    问题 我需要使用AES算法对Java应用程序中的某些值进行加密,并在我的应用程序的Javascript模块中对其进行解密。 我在互联网上看到了一些示例,但兼容性似乎有所不同。 像下面的问题: JavaScript中的AES加密和Java中的解密 有人可以给我指出一些代码示例来解决此问题。 谢谢。 回答1 AES是精确指定的算法,因此所有AES实现都必须是“兼容的”。 话虽这么说,AES是可变密钥长度的块密码,在128位块上运行。 要在某个软件中实际使用它,您还必须做出其他选择:如何处理由1个以上的块组成的输入(这称为“模式”),在某些模式下,您需要初始化向量,您需要处理的输入不包括确切的块数(填充),如何将字符编码为字节以及如何在不支持该字符的上下文(如源文件)中表示字节。 所有这些东西都需要兼容。 下面是一个经过测试的示例。 它使用标准的Java加密函数(和Apache Commons Codec)和JavaScript加密库crypto-js。 选项如下:128位密钥,密码块链接模式(需要初始化向量),PKCS5 / 7填充,用于字符编码的UTF-8,用于表示字节数组的Base64。 这一段Java将输出Base64编码的密文: String plainText = "Hello, World! This is a Java/Javascript AES test."
  • JavaScript字符串加密和解密?(JavaScript string encryption and decryption?)
    问题 我有兴趣构建一个供个人使用的小型应用程序,该应用程序将使用JavaScript在客户端加密和解密信息。 加密的信息将存储在服务器上的数据库中,但不会存储在解密版本中。 它不必具有超级duper的安全性,但是我想使用当前不间断的算法。 理想情况下,我可以做类似的事情 var gibberish = encrypt(string, salt, key); 生成编码的字符串,诸如此类 var sensical = decrypt(gibberish, key); 稍后再解码。 到目前为止,我已经看到了:http://bitwiseshiftleft.github.io/sjcl/ 还有其他我应该看的库吗? 回答1 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(
  • 使用 CryptoJS 解密 AES/CBC/PKCS5Padding(Decrypt AES/CBC/PKCS5Padding with CryptoJS)
    问题 我使用 Java javax.crypto API 生成 128 位AES/CBC/PKCS5Padding密钥。 这是我使用的算法: public static String encryptAES(String data, String secretKey) { try { byte[] secretKeys = Hashing.sha1().hashString(secretKey, Charsets.UTF_8) .toString().substring(0, 16) .getBytes(Charsets.UTF_8); final SecretKey secret = new SecretKeySpec(secretKeys, "AES"); final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secret); final AlgorithmParameters params = cipher.getParameters(); final byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); final byte[] cipherText =
  • AES 在cryptojs 中加密并在python Crypto.Cipher 中解密(AES encrypt in cryptojs and decrypt in python Crypto.Cipher)
    问题 使用 js CryptoJS 进行加密并使用 python crypto.Cipher 解密时遇到问题 这是我在 js 中的实现,用加密消息附加 iv 并用 base64 编码 <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> <script> var message='Secreat Message to Encrypt'; var key = CryptoJS.enc.Hex.parse('824601be6c2941fabe7fe256d4d5a2b7'); var iv = CryptoJS.enc.Hex.parse('1011121314151617'); var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv, mode: CryptoJS.mode.CBC }); encrypted =encrypted.toString(); encrypted = iv+encrypted; encrypted = btoa(encrypted); console.log('encrypted',encrypted ); alert(encrypted); // var