- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 .NET 中的 javascript 库 SlowAES 和 RijndaelManaged 类设置 AES 加密/解密。
我在阅读 this post 后选择了这种方法,其中 Cheeso 设法让这两种加密方法一起玩
"In my tests of the COM-wrapped-SlowAEs, I used CBC mode, and the encryption was completely compatible with the RijndaelManaged class in .NET" - Cheeso
我从 Cheeso 的 Windows 脚本组件、最新的 slowaes 库中获取了 javascript 代码,并使用以下 javascript 脚本进行测试:
var key = "12345678901234567890123456789012";
var message = "watson?";
var decrypted;
slowAES.aes.keySize.SIZE_256;
slowAES.modeOfOperation.CBC;
put_PassPhrase(key);
var result = EncryptString(message);
decrypted = DecryptCommaDelimitedStringToString(result)
document.write("Key:" + key + "<br />original:" + message + "<br />Cypher:" + result + "<br />Decrypted:" + decrypted + "<br />IV(): " + get_IV());
我得到以下输出:
Key:12345678901234567890123456789012
original:watson?
Cypher:245,159,1,1,168,1,1,143,1,1,146,1,1,239,117,1
Decrypted:watson?
IV(): 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
我修改了以下示例,发现 on MSDN 以尝试匹配 C# 中的加密:
public static void Main()
{
try
{
string original = "watson?";
byte[] IV = new byte[16]; // match slowaes IV
byte[] key = new System.Text.ASCIIEncoding().GetBytes("12345678901234567890123456789012");// match slowaes KEY
RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.BlockSize = 128;
myRijndael.KeySize = 256;
myRijndael.Mode = CipherMode.CBC;
// Encrypt the string to an array of bytes.
byte[] encrypted = encryptStringToBytes_AES(original, key, IV);
// Decrypt the bytes to a string.
string roundtrip = decryptStringFromBytes_AES(encrypted, key, IV);
//Display the original data and the decrypted data.
Console.WriteLine("Original: {0}", original);
Console.WriteLine("Round Trip: {0}", roundtrip);
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
观察字节数组:
- encrypted {byte[16]} byte[]
[0] 139 byte
[1] 104 byte
[2] 166 byte
[3] 35 byte
[4] 8 byte
[5] 42 byte
[6] 216 byte
[7] 160 byte
[8] 235 byte
[9] 153 byte
[10] 23 byte
[11] 143 byte
[12] 105 byte
[13] 3 byte
[14] 24 byte
[15] 255 byte
我已经尝试了托管 .NET 类的所有填充选项,但是我无法使加密输出匹配。谁能帮帮我?
谢谢,
鲍勃
最佳答案
也许我能帮上忙。
我获取了您的 C# 代码并稍作修改。我使用的完整 C# 代码是:
using System;
using System.Security.Cryptography;
public class Bob
{
internal static string FormatByteArray(byte[] b)
{
System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
int i = 0;
for (i = 0; i < b.Length; i++)
{
if (i != 0 && i % 16 == 0)
sb1.Append("\n");
sb1.Append(System.String.Format("{0:X2} ", b[i]));
}
return sb1.ToString();
}
public static void Main()
{
try
{
string original = "watson?";
Console.WriteLine("Original: {0}", original);
byte[] IV = new byte[16]; // match slowaes IV
var ascii = new System.Text.ASCIIEncoding();
// match slowaes KEY
string passPhrase = "12345678901234567890123456789012";
byte[] key = ascii.GetBytes(passPhrase);
RijndaelManaged myRijndael = new RijndaelManaged();
myRijndael.BlockSize = 128;
myRijndael.KeySize = 256;
myRijndael.IV = IV;
myRijndael.Padding = PaddingMode.PKCS7;
myRijndael.Mode = CipherMode.CBC;
myRijndael.Key = key;
// Encrypt the string to an array of bytes.
byte[] plainText = new System.Text.ASCIIEncoding().GetBytes(original);
ICryptoTransform transform = myRijndael.CreateEncryptor();
byte[] cipherText = transform.TransformFinalBlock(plainText, 0, plainText.Length);
Console.WriteLine("cipherText: {0}", FormatByteArray(cipherText));
// Decrypt the bytes to a string.
transform = myRijndael.CreateDecryptor();
plainText = transform.TransformFinalBlock(cipherText, 0, cipherText.Length);
string roundtrip = ascii.GetString(plainText);
Console.WriteLine("Round Trip: {0}", roundtrip);
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
}
编译上面的内容
csc.exe /target:exe /out:Bob.exe Bob.cs
我使用您引用的另一篇文章中的 slowAES.wsc,但有 2 处更改:我没有为 EncryptString 或 DecryptString() 方法中的 key 调用 getPaddedBlock()。这确实需要一个 PBKDF,但我们现在不用担心。修改后的 EncryptString 如下所示:
function EncryptString(plainText)
{
// this is really wrong - need a PBBKDF to get the key, instead
// of just using the passphrase
var key = cryptoHelpers.convertStringToByteArray(_passphrase);
// var nkey = slowAES.getPaddedBlock(key, 0, _keysize, _mode);
var bytesToEncrypt = cryptoHelpers.convertStringToByteArray(plainText);
var result = slowAES.encrypt(bytesToEncrypt,
_mode,
key,
_keysize,
_iv);
return result['cipher'];
}
这意味着您必须使用正好 key 大小所需长度的密码。如果您使用 AES256,则传递 32 个字符的字符串(32 * 8 = 256 位)。好像你已经想通了。
WSC 组件的客户端也是 Javascript(尽管它可以是任何 COM 语言)。这是我使用的。
function toHexString(a)
{
var ret = '';
for(var i = 0;i < a.length;i++)
ret += (a[i] < 16 ? '0' : '') + a[i].toString(16) + ' ';
return ret.toLowerCase();
}
//var plaintext = "Hello. This is a test. of the emergency broadcasting system.";
var plaintext = "watson?";
try
{
WScript.echo( "plaintext: " + plaintext);
WScript.echo( "plaintext.length: " + plaintext.length);
WScript.echo( "instantiate ");
var aes = new ActiveXObject("Ionic.Com.SlowAES");
WScript.echo( "keysize ");
aes.KeySize = 256;
WScript.echo( "passphrase ");
aes.PassPhrase= "12345678901234567890123456789012"; // 32 chars long
WScript.echo( "mode ");
aes.Mode = "CBC";
WScript.echo( "encrypting... ");
var result = aes.EncryptString(plaintext);
WScript.echo( "Cryptotext: " + toHexString(result));
WScript.echo( "decrypting... ");
var decrypted = aes.DecryptBytesToString(result);
WScript.echo( "decrypted: " + decrypted);
}
catch(e)
{
WScript.echo("Exception: " + e);
// WScript.echo(e.Number + ": " + e.Name);
WScript.echo(e.Message);
}
如果我随后运行此代码,Javascript 和 C# 会使用 AES256、密码短语 12345678901234567890123456789012 和 16 字节零的 IV 为明文“watson?”生成相同的密文。生成的密文为:
8B 68 A6 23 08 2A D8 A0 EB 99 17 8F 69 03 18 FF
在这两种情况下都成功解密。
编辑:虽然我在 WSC 中打包了 slowAES 加密,但它在 COM 环境之外运行时也可以互操作。 WSC 部分对于这个问题是不必要的,但对于证明先前问题的答案是必要的,即“how can I get VBScript and .NET AES to interoperate?”
EDIT2:演示 Javascript 或 VBScript 与 .NET is available 之间的 AES 互操作的源代码。我扩展了此处给出的基本示例,以使用 3 种语言生成测试应用程序:C#、Javascript 和 VBScript。他们都采用相同的论点。它们各自使用符合 RFC2898 的 key 派生函数。您可以指定密码、salt、IV 和明文,以及要在 PBKDF2 中使用的 RFC2898 迭代次数。您可以轻松验证每个测试程序的密文是否相同。也许这个例子对某人有用。
关于.net - 让 .NET 中的 SlowAES 和 RijndaelManaged 类一起玩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1149611/
问题 我想用 RijndaelManaged 解密加密数据但结果始终为空("" 或数据长度全为零的字节数组)。 所有参数,盐和数据都正确,CryptoHelper.CreateRijndaelMana
我在搜索 RSACypthyServiceProvider 时在 MSDN 上找到了以下代码示例。在评论的帮助下我无法理解代码的某些部分。 什么是模数和指数? 什么是IV? 为什么他们使用 Rijnd
我想在我的应用程序中实现最安全、最可靠的对称 key 加密形式。用户应该输入密码来加密/解密,仅此而已。对于 RijndaelManaged,必须输入 key 和 IV。我不确定如何解决这种情况。现在
我有一个关于加密的问题:基本上在我的网络应用程序中我使用了 Enterprise Library 5.0 他们有一个密码 block ,所以基本上在他们提供的配置工具中我注册了一个 block 并生成
我正在尝试使用 Rijndael 256 位 block 大小、256 位 key 大小、ECB 模式和用于填充的零进行加密。 我试图使用 OpenSSL::Cipher::AES.new(256,
我可以加密图像文件。但无法解密该文件。 while ((readLen = cryptStrm.Read(bs, 0, bs.Length)) > 0) 谁能猜出哪一部分是错的?我编写的代码如下。 当
我在使用 RijndaelManaged 时遇到了一个奇怪的问题。基本上我有一个新实例,我在其中设置了 CipherMode、Padding、IV 和 Key。然后,我创建了另一个实例并将以下属性的相
我有以下 C# 代码(代码是继承的,无法编译)。这用于解密和解压缩保存的文件。 using System.Security.Cryptography; using System.Text; using
我已经从 http://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptostream.aspx 中获取了解密代码
我想使用 RijndaelManaged 通过任何加盐来加密字符串,因此如果我使用相同的 key 传递加密字符串,我将收到相同的密文。我调用的方法看起来像这样 public static s
有两种方法可以为 RijndaelManaged 指定 key 和 IV。对象。一种是调用CreateEncryptor : var encryptor = rij.CreateEncryptor(E
我目前正在开发一个连接到旧网络服务的 Silverlight 应用程序。 我们的旧网络服务使用了 Silverlight 不支持的加密工具。 最后,我们决定使用 AesManaged 进行加密,但是,
关于方法... RijndaelManaged.CreateDecryptor Method (Byte[], Byte[]) Here它说的是第一个参数... The secret key to b
我正在尝试使用 .NET 中的 RijndaelManaged 类来加密文本字符串。但是,我不断收到 CryptographicException(“要解密的数据长度无效”)。此消息并不是很有帮助,尤
鉴于我将 KeySize 设置为 192,当我通过执行以下操作加密一些数据时: static void Main() { var querystrings =
我得到了这段代码: public static string DoPrefixCipherEncrypt(string strIn, byte[] btKey) { i
我花了一些时间学习如何在 .NET 中使用 RijndaelManaged 库,并开发了以下函数来测试加密文本,并对 MSDN 库稍作修改: Function encryptBytesToBytes_
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我知道有人对此提出了其他问题,但到目前为止还没有提供解决方案或正是我遇到的问题。 下面的类处理字符串的加密和解密,传入的 key 和向量始终相同。 被加密和解密的字符串总是数字,大多数工作但偶尔会在解
RijndaelManaged 类属性 KeySize 、 BlockSize 、 FeedbackSize 和 Padding 的默认值是什么?默认值是否也是最好的? 最佳答案 这是 Rijndea
我是一名优秀的程序员,十分优秀!