C# 出错';加密验证输入';尝试复制MS Office时的值';s文件加密

C# 出错';加密验证输入';尝试复制MS Office时的值';s文件加密,c#,encryption,aes,ms-office,C#,Encryption,Aes,Ms Office,我试图重现MS Word基于给定密码加密文档的方式。 我有一个文档,密码为“1234”,使用最新版本的Word及其最新算法进行加密(如果我没有弄错的话),如下所述: 加密后,我将文件提取为.zip,并从encryptedKey节点的EncryptionInfo流中获取以下xml: 从salt值和原始密码中,我想找到encryptedVerifierHashInput的值,但是我得到了不同的结果,我找不到我遗漏的内容 以下是主要功能: string str_password=“1234”;

我试图重现MS Word基于给定密码加密文档的方式。

我有一个文档,密码为“1234”,使用最新版本的Word及其最新算法进行加密(如果我没有弄错的话),如下所述:

加密后,我将文件提取为.zip,并从encryptedKey节点的EncryptionInfo流中获取以下xml:


从salt值和原始密码中,我想找到encryptedVerifierHashInput的值,但是我得到了不同的结果,我找不到我遗漏的内容

以下是主要功能:

string str_password=“1234”;
字符串base64_saltValue=“80qqrantPuTWTxMNG1Rc/w==”;
字符串expectedBase64_encryptedVerifierHashInput=“X37eBfS7J5BNwTcD4dK2CQ=”;
byte[]password=Encoding.Unicode.GetBytes(str_password);
字节[]salt=Convert.FromBase64String(base64\u saltValue);
//encryptedVerifierHashInput密钥的块密钥,如中所述:
// https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/a57cb947-554f-4e5e-b150-3f2978225e92
字节[]块键={0xfe,0xa7,0xd2,0x76,0x3b,0x4b,0x9e,0x79};
Console.WriteLine(“salt长度:\t”+salt.length);
SHA512 shaM=新的SHA512管理();
字节[]IV_tmp=shaM.ComputeHash(Combine(salt,blockKey));//长度=32:截断
字节[]IV=新字节[16];
数组.Copy(IV_-tmp,IV,16);
Console.WriteLine(“IV长度:\t”+IV.length);
Console.WriteLine(“块键长度:+blockKey.length”);
byte[]key_tmp=CreateKey(salt、password、blockKey);//长度=64:截断
字节[]键=新字节[32];
Array.Copy(key_tmp,key,32);
Console.WriteLine(“键长度:\t”+键长度);
Console.WriteLine(“key base64:\t”+Convert.ToBase64String(key));
字节[]encryptedVerifierHashInput=加密(salt、密钥、IV);
Console.WriteLine(“\n encryptedVerifierHashInput from password”“+str_password+”:\n”);
Console.WriteLine(“预期:+expectedBase64_encryptedVerifierHashInput”);
Console.WriteLine(“get:+Convert.ToBase64String(encryptedVerifierHashInput));
Console.Read();
生成密钥的函数:

//https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/74d60145-a0f0-44be-99ce-c65d211b4eb7
私有静态字节[]CreateKey(字节[]salt,字节[]密码,字节[]块密钥,int spinCount=100000)
{
SHA512 shaM=新的SHA512管理();
//初始密码散列:H0=H(salt+密码)
byte[]hash=shaM.ComputeHash(Combine(salt,password));
//散列迭代:Hn=H(迭代器+Hn-1)
对于(int-iter=0;iter
我从另一篇文章中获得的加密功能:

公共静态字节[]加密(字节[]数据,字节[]密钥,字节[]iv)
{
使用(var aes=aes.Create())
{
aes.KeySize=256;
aes.BlockSize=128;
aes.Padding=PaddingMode.zero;
aes.Key=Key;
aes.IV=IV;
使用(var encryptor=aes.CreateEncryptor(aes.Key,aes.IV))
{
返回性能记录(数据、加密机);
}
}
}
专用静态字节[]性能密码(字节[]数据,ICryptoTransform加密转换)
{
使用(var ms=new MemoryStream())
使用(var cryptoStream=newcryptostream(ms,cryptoTransform,CryptoStreamMode.Write))
{
cryptoStream.Write(数据,0,数据长度);
cryptoStream.FlushFinalBlock();
返回ToArray女士();
}
}
联合收割机功能(但不应导致任何问题):

公共静态字节[]组合(字节[]第一,字节[]第二)
{
byte[]ret=新字节[first.Length+second.Length];
Buffer.BlockCopy(first,0,ret,0,first.Length);
块复制(秒,0,ret,first.Length,second.Length);
返回ret;
}
最后,我得到的结果是:

salt length:    16
IV length:      16
blockKey length: 8
key length:     32
key base64:     dgtuBO7k4UhhoXdICagE7pkcbPKsxY1zEX89ayzXNn0=

 encryptedVerifierHashInput from password '1234':

Expected:   X37eBfS7J5BNwTcD4dK2CQ==
Got:        kv8EFmm1+ho1dy7zTyFFWg==

我正在尝试阅读MS文档,但它写得糟糕得令人难以置信,而且很难理解。感谢您在任何情况下提供的帮助。。。我觉得我在密码学方面还是太新手了……嗯,我不是新手,我可以告诉你,它写得很糟糕,也不清楚。对不起,我帮不上忙了。没事的,谢谢你的帮忙。这就是我希望在将来能回来回答的问题,嘲笑我自己的无知!