我正在研究基本加密方法.我正在使用RijndaelManaged.我很久以前从某个地方得到了这个代码,但是不记得在哪里.
之前我的代码工作正常,但是有些东西发生了变化,我无法弄明白.
当我运行我的代码时,我收到以下错误;
指定的初始化向量(IV)与此算法的块大小不匹配.
这是我的代码:
string textToEncrypt = "TEST STRING";
int keySize = 256;
string hashAlgorithm = "SHA1";
string passPhrase = "AH!PSB0%FGHR$";
string saltValue = "LRT%YUR#VBNL@1";
string initVector = "HR$2pIjHR$2pIj";
byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
byte[] plainTextBytes = Encoding.UTF8.GetBytes(textToEncrypt);
var password = new PasswordDeriveBytes(passPhrase, saltValueBytes, hashAlgorithm, 2);
byte[] keyBytes = password.GetBytes(keySize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes,initVectorBytes);
MemoryStream memoryStream = new MemoryStream();
var cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);
cryptoStream.Write(plainTextBytes, 0, …Run Code Online (Sandbox Code Playgroud) 如何使用密码短语生成Rijndael KEY和IV?密钥长度必须为256位.
现在,我可以让RijndaelManaged算法在打开FIPS的本地安全设置的计算机上工作的唯一方法就是禁用它.这是一台政府计算机,所以我不确定它会如何飞行.我在msdn博客网站上看过他们说他们正在开发AES FIPS兼容版本的帖子,但我似乎无法找到更多.有谁知道这可能发生的时间?
我们需要在Java中进行一些Rijndael开发.
对文章,图书馆等有什么建议可以帮助我们吗?
任何指向密钥库维护的指针以及如何安全地存储密钥?
编辑:
它需要是开源的.从本质上讲,它只是使用Rijndael对数据进行标准加密/解密.
我有一个用C#编写的加密/解密算法 - 我需要能够在PHP中生成相同的加密,这样我就可以通过HTTP发送加密文本,在C#端解密.这是加密的C#代码.
this.m_plainText = string.Empty;
this.m_passPhrase = "passpharse";
this.m_saltValue = "saltvalue";
this.m_hashAlgorithm = "SHA1";
this.m_passwordIterations = 2;
this.m_initVector = "1a2b3c4d5e6f7g8h";
this.m_keySize = 256;
public string Encrypt()
{
string plainText = this.m_plainText;
string passPhrase = this.m_passPhrase;
string saltValue = this.m_saltValue;
string hashAlgorithm = this.m_hashAlgorithm;
int passwordIterations = this.m_passwordIterations;
string initVector = this.m_initVector;
int keySize = this.m_keySize;
// Convert strings into byte arrays.
// Let us assume that strings only contain ASCII codes.
// If strings include Unicode characters, use Unicode, …Run Code Online (Sandbox Code Playgroud) 我正在维护的PHP应用程序使用带有Ecry_MODE加密的Rijndael_256和mcrypt.有趣的是,密钥不是256位长,而是只有160.根据mcrypt_encrypt文档,密钥用\ 0填充以获得所需的大小,如果它太小.
用于加密数据的密钥.如果它小于所需的密钥大小,则用'\ 0'填充.最好不要将ASCII字符串用于键.
这似乎发生在mcrypt.c中第1186行的开头附近,并在第1213行修改了密钥.
因此,假设我们已经得到$key = 'abcdefghijkm';了太短的内容,但PHP的mcrypt实现确保在使用RIJNDAEL_256时它扩展到32个字符(或256位).最终的关键是什么样的?
我问这个是因为正在构建另一个使用相同加密数据的应用程序,但是使用另一种语言.Perl准确而且我正在使用Crypto::Rijndael.对于给定的示例密钥,Crypto::Rijndael为了能够再次解密数据,我必须提供哪些准确的密钥(或其他任何内容)?
更新
使用Perl,我可以生成一个键为0的填充pack('a32', 'my secret key');(或Z32),length()将报告32并且Crypt::Rijndael模块接受密钥.看看PHP的mcrypt的来源,这应该是生成的密钥(\ 0填充),但它根本不会接受它.
从理论上讲,PHP pack('a32', 'my secret key');应该会产生PHP的mcrypt生成的相同\ 0填充键,但事实并非如此.
我非常接近只是用一把新密钥加密所有东西.这花费了太多时间.
很长一段时间以来,我一直在尝试破解ASP .ASPXAUTH cookie并使用PHP解密它.我的理由是巨大的,我需要这样做,没有其他选择.到目前为止,在PHP中我成功地设法从这个cookie中读取数据,但是在加密时我似乎无法做到这一点.无论如何,这里......
首先,您需要更改服务器Web.config文件(保护需要设置为Validation):
<authentication mode="None">
<forms name=".ASPXAUTH" protection="Validation" cookieless="UseCookies" timeout="10080" enableCrossAppRedirects="true"/>
</authentication>
Run Code Online (Sandbox Code Playgroud)
然后在同一个域的PHP脚本中,您可以执行以下操作来读取数据,这是一个非常基本的示例,但是证明:
$authCookie = $_COOKIE['_ASPXAUTH'];
echo 'ASPXAUTH: '.$authCookie.'<br />'."\n";//This outputs your plaintext hex cookie
$packed = pack("H*",$authCookie);
$packed_exp = explode("\0",$packed);//This will separate your data using NULL
$random_bytes = array_shift($packed_exp);//This will shift off the random bytes
echo print_r($packed_exp,TRUE); //This will return your cookies data without the random bytes
Run Code Online (Sandbox Code Playgroud)
这会分解cookie,或者至少是未加密的数据:

既然我知道我可以获取数据,我从Web.config中删除了'protection ="validation"'字符串,我尝试使用PHP mcrypt解密它.我尝试了无数的方法,但这是一个很有希望的例子(失败了)......
define('ASP_DECRYPT_KEY','0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8');//This is a decryption key found in my Machine.config file (please note this is forged for example) …Run Code Online (Sandbox Code Playgroud) 我希望使用特定的密钥和IV值在VBScript中使用Rijndael/AES加密一些数据.有没有好的功能库或COM组件可以使用?
我看着CAPICOM ; 它只允许使用密码,并且不允许设置特定的密钥和IV值.
我在C#应用程序中工作.我们有将数据存储在文件中的常用方法.这些方法加密数据并将其存储在文件系统上.当我们需要数据时,ReadData方法解密数据并返回纯文本.
如果文本的大小很小,这段代码在正常情况下工作正常.但是对于下面给出的示例文本,解密代码抛出异常 - 要解密的数据长度无效.
该异常发生在行
// close the CryptoStream
x_cryptostream.Close();
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的方法,但没有运气.有些人可以帮忙.
为什么我要加密已经加密的数据 - 我只是试图使用庞大应用程序的常用方法存储在一个文件中.常见的方法storedata(key,data)NAD readdata(key)做加密/解密我无法回避.
public static byte[] Decrypt(byte[] ciphertext, string Key, string IV)
{
byte[] k = Encoding.Default.GetBytes(Key);
byte[] iv = Encoding.Default.GetBytes(IV);
// create the encryption algorithm
SymmetricAlgorithm x_alg = SymmetricAlgorithm.Create("Rijndael");
x_alg.Padding = PaddingMode.PKCS7;
// create an ICryptoTransform that can be used to decrypt data
ICryptoTransform x_decryptor = x_alg.CreateDecryptor(k, iv);
// create the memory stream
MemoryStream x_memory_stream = new MemoryStream();
// create the CryptoStream that ties …Run Code Online (Sandbox Code Playgroud) 我正在使用Rijndael来加密程序中的一些敏感数据.
当用户输入错误的密码时,大多数时候CryptographicException会抛出一条消息"填充无效且无法删除".
但是,如果概率非常小,CryptStream不会使用错误的密码抛出异常,而是会返回错误解密的流.换句话说,它解密为垃圾.
知道如何检测/防止这种情况吗?我能想到的最简单的方法是在加密时在消息的开头添加一个"幻数",并在解密后检查它是否仍在那里.
但如果有更简单的方法,我很乐意听到它!