- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 C# 加密字符串需要在 node.js 中解密。我目前正在使用 cryptoJS 作为解密器。
下面是用C#对字符串进行初始加密的代码:
CryptoAgent 构造函数使用 Guid 构建算法 key 和初始化向量。例如,“A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B”。
public CryptoAgent(Guid keyGuid)
{
_UseSymmetricEncryption = true;
byte[] guidArr = keyGuid.ToByteArray();
Array.Resize<byte>(ref guidArr, 24);
_Key = (byte[])guidArr.Clone();
Array.Reverse(guidArr);
_IV = guidArr;
}
加密方法非常简单。它获取纯文本并使用上面创建的 key 和 iv 加密数据,然后以 URL 友好字符串的形式返回它。例如,“Email=testuser@gmail.com&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B”
private string EncryptSymmetric(string plainText)
{
if (string.IsNullOrEmpty(plainText))
{
throw new ArgumentNullException("The string to be encrypted cannot be null.");
}
ICryptoTransform transform;
TripleDESCryptoServiceProvider csp = new TripleDESCryptoServiceProvider();
transform = csp.CreateEncryptor(_Key, _IV);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write);
byte[] plaintextBytes = Encoding.Unicode.GetBytes(plainText);
cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedData = memoryStream.GetBuffer();
Console.WriteLine(csp.Mode);
Console.WriteLine(csp.Padding);
return UrlNormalize(Convert.ToBase64String(encryptedData, 0, (int)memoryStream.Length));
}
生成的加密字符串如下:
ZuD6CIEY6b-sh9Q6DRh9SWE0YyC92Jmw1oplTqy7kjETXoNio42hoJxDmMr7V-Sp14aX9lwTxYBM_KjAbEevElE_7nUzC_C4nM13LHHbpg6aR8xO39RseQjpLCLYj5ZKKWiXZREqpvDBlvtF-F1VuqyAMa0ECYODN8ZCcmmyIHuCpalcUkLZ0zZajwutIrtmmqg3VXQNT3E~
我的任务是接收这个加密的字符串并在 node.js 中解密该字符串并解析出两个参数以供进一步使用。下面是我的初始解密文件:
var CryptoJS = require("crypto-js");
var text = "Email=testuser@gmail.com&ProductUserId=C4B80D7F-A8D0-11E4-BA34-AC7BA1ACF56B";
var key = "A925B4D6-A8D0-11E4-BA34-AC7BA1ACF56B";
var useHashing = true;
if (useHashing){
key = CryptoJS.MD5(key).toString();
key = key + '0000000000000000';
}
var textWordArray = CryptoJS.enc.Utf16.parse(text);
var keyHex = CryptoJS.enc.Hex.parse(key);
var iv = reverseHexString(keyHex.toString());
var ivHex = CryptoJS.enc.Hex.parse(iv);
console.log('hexadecimal key: ' + keyHex + '\n');
console.log('hexadecimal iv: ' + ivHex + '\n');
var options = {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: ivHex
};
var encrypted = CryptoJS.TripleDES.encrypt(textWordArray, keyHex, options);
var base64String = encrypted.toString();
console.log('base64: ' + base64String + '\n');
var decrypted = CryptoJS.TripleDES.decrypt( {
ciphertext: CryptoJS.enc.Base64.parse(base64String)
}, keyHex, options);
console.log('decrypted: ' + decrypted.toString(CryptoJS.enc.Utf16));
function reverseHexString(hexStr) {
var first32 = hexStr.substring(0, 32);
var reverseFirst32 = first32.split("").reverse().join("").split("");
var reverseHex = '0000000000000000';
for (var i = 0; i < reverseFirst32.length; i+=2) {
reverseHex += reverseFirst32[i+1];
reverseHex += reverseFirst32[i];
};
return reverseHex;
}
我最初运行的解决方案导致解密失败并产生一行问号。
使用 C# 代码,我能够打印出键值和 iv 值。我试图用从 C# 打印的 key 和 iv 值替换 keyHex 和 ivHex Javascript 值,但解密仍然失败。
非常感谢可以提供的任何帮助。
谢谢
最佳答案
这不起作用的原因可能是 key 生成:您使用 ASCII 零而不是 \0
并且您有 16 个而不是 8 个(MD5 给出 16 个字节,而您想要 24 个字节 TDES key )。这对 key 来说并不坏,因为 CryptoJS 只会忽略额外的字节,但由于您反转 key 以获得 IV,因此您得到的是错误的 IV。
关于javascript - triple des 加密 c# 并在 javascript 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28245929/
我正在尝试使用 DES API 来实现 3Des,如下所示: des(input, output, key, mode) 其中输入、输出和 key 各为 8 个字节,模式标识加密和解密类型。我想知道是
有人比较这些加密算法的优缺点吗? 最佳答案 使用 AES。 更多详细信息: DES 是七十年代的旧“数据加密标准”。它的 key 大小对于适当的安全性而言太短(56 个有效位;这可以被暴力破解,如 m
我收到了来自Java的加密字符串,我可以看到Java加密的源代码。我用C#编写了解密代码。但总是在“FlushFinalBlock”处报错。错误消息:“System.Security.Cryptogr
我应该使用加密 DES-EDE3-CBC。这是否意味着它是密码 block 链接模式下的 Triple DES? 最佳答案 是的。 EDE 部分告诉您使用 3DES 的特定变体(无论如何,每个人都默认
有没有人一起比较这些加密算法的优缺点? 最佳答案 使用 AES。 更多细节: DES 是七十年代的旧“数据加密标准”。它的 key 大小对于适当的安全性来说太短了(56 位有效位;这可以被强制执行,正
我在整个网络上寻找这个问题,但找不到明确的答案: 我有一些使用 DESCryptoServiceProvider(Mode = CRC,Padding = none)的 C# 代码,并且我正在使用 o
嗨,大家好,我有 java 代码,它为我生成三重加密代码,现在我尝试使用 crypto-js 在 javascript 上使用它,但这两个代码提供了不同的 key ,我不知道为什么以及如何获得相同的
我需要在我的 Erlang/OTP Web 服务器和 JavaScript 之间传送加密数据。我已经 checkout Crypto-js.js Library 。我想使用 DES 加密我的数据 在
我发现了一个问题,Elephantik 的答案基本上回答了我的问题: DES Initialization Vector in C# 我有一个使用 DES.EXE 命令行工具加密的文件。我可以使用以下
我正在努力让 Java 代码输出与 C# 代码相同的 Byte[]。 C# 代码: using System; using System.IO; using System.Security.Crypt
我从第三方公司收到了一些 DES 加密的东西。我无法用 ruby 解密它。但它适用于我的 java 代码。 这里是java代码: public class Main { public static v
它似乎混淆了 Triple-DES(>128 位)和普通 DES(64 位)。我正在尝试使用 Java 1.5 使用 Triple DES(或 DESede)加密 Derby 数据库 我找到了这个 d
我遇到了编码问题。我想在 HTML 文件中添加法语口音。 我在 Ubuntu 上,我的编辑器是 SciTE。 这是一个 Ruby on Rails 程序。 ActionView::WrongEncod
这个问题已经有答案了: Error parsing XHTML: The content of elements must consist of well-formed character data
我需要加密 ISO 8583消息...这里的问题是消息比 key 长。我需要有人帮我加密这个字符串。 例如:我的字符串中有 300 个字符;我应该单独加密每 16 个字符然后连接它们,因为我的主 ke
我想知道在下面的代码中是否添加了 PKCS#5 填充?如果不是如何添加? $message = "insert plaintext message here"; $iv = pack('H*', '
我已经使用内置库在 Java 中编码了 DES,但我没有得到正确的加密结果。请解释一下我在哪里犯了错误 import javax.crypto.Cipher; import javax.crypto.
在下面,您将看到一个简单的 Java Card 小程序,它被编写为使用不同的 DES 和 3DES 算法加密和解密数据。 这些是支持的命令: 00 C0 00 00 | key 长度 | KeyVal
我在我的应用程序中使用 DES-ECB + base64 加密。这就是我称之为“Crypto”的类的代码 public class Crypto { public static string
我创建了一个 Android 应用程序,它从安装在智能手机上的传感器读取数据,并将这些数据以 JSON 格式发送到应用程序服务器。 我将服务器和 Android 应用程序配置为通过 https 协议(
我是一名优秀的程序员,十分优秀!