簡體   English   中英

使用C#加密並使用OpenSSL解密

[英]Encrypt with C# & decrypt with OpenSSL

我使用.NET加密文件。

接下來,我嘗試使用OpenSSL對其進行解密,但是我遇到了一個問題:

bad decrypt
4294956672:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:529:

我簡化了示例:

  • 我不會在.NET中生成密鑰和iv並從OpenSSL使用它
  • 我不用鹽
  • 我不使用base64,只使用二進制

所以,

1)我從OpenSSL獲得IV和密鑰

openssl enc -aes-256-cbc -pass pass:myPassword -P -nosalt
key=69BD0330B47FF638C3471005819C28F7B938830888101C9135EF41D8641F2709
iv =71C334727A6C5DE704C21965E9BAC0F8

2)我加密文件:

調用:

key = new byte[]{0x69, 0xBD, 0x03, 0x30, 0xB4, 0x7F, 0xF6, 0x38, 0xC3, 0x47, 0x10, 0x05, 0x81, 0x9C, 0x28, 0xF7, 0xB9, 0x38, 0x83, 0x08, 0x88, 0x10, 0x1C, 0x91, 0x35, 0xEF, 0x41, 0xD8, 0x64, 0x1F, 0x27, 0x09};
iv = new byte[]{0x71, 0xC3, 0x34, 0x72, 0x7A, 0x6C, 0x5D, 0xE7, 0x04, 0xC2, 0x19, 0x65, 0xE9, 0xBA, 0xC0, 0xF8};
byte[] response = await EncryptString(textWriter.ToString(), key, iv);

功能:

public async Task<byte[]> EncryptString(string plainText, byte[] key, byte[] iv)
{
    Aes encryptor = Aes.Create();

    encryptor.Mode = CipherMode.CBC;
    encryptor.Key = key;
    encryptor.Padding = PaddingMode.PKCS7;
    encryptor.BlockSize = 128;
    encryptor.IV = iv;
    encryptor.KeySize = 256;

    // Convert the plainText string into a byte array
    byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);

    using (MemoryStream memoryStream = new MemoryStream())
    {
        ICryptoTransform aesEncryptor = encryptor.CreateEncryptor();

        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aesEncryptor, CryptoStreamMode.Write))
        {
            await cryptoStream.WriteAsync(plainBytes, 0, plainBytes.Length);
        }
        return memoryStream.ToArray();
    }
}

3)我將字節數組寫入文件(我必須使用FTP)

public async Task UploadFileAsync(Uri uri, string login, string password, byte[] content)
{
    FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
    ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
    ftpRequest.UseBinary = true;
    ftpRequest.UsePassive = true;
    ftpRequest.KeepAlive = true;

    SetFtpCredentials(ftpRequest, login, password);

    using (var stream = new BinaryWriter(ftpRequest.GetRequestStream()))
    {
        stream.Write(content,0,content.Length);
    }


    using (var ftpResponse = (FtpWebResponse)ftpRequest.GetResponse())
    {
        using (Stream ftpStream = ftpResponse.GetResponseStream())
        {
        }
    }
}

4)我嘗試解密文件

openssl.exe aes-256-cbc -in input.xml -d -out output.xml -md sha256 -nosalt -debug  -K 69BD0330B47FF638C3471005819C28F7B938830888101C9135EF41D8641F2709 -iv 71C334727A6C5DE704C21965E9BAC0F8

響應:

BIO[0x600060ee0]: ctrl(108) - FILE pointer
BIO[0x600060ee0]: ctrl return 1
BIO[0x600060f60]: ctrl(108) - FILE pointer
BIO[0x600060f60]: ctrl return 1
BIO[0x600061080]: ctrl(6) - cipher
BIO[0x600060f60]: ctrl(6) - FILE pointer
BIO[0x600060f60]: ctrl return 0
BIO[0x600061080]: ctrl return 0
BIO[0x600060ee0]: read(0,8192) - FILE pointer
BIO[0x600060ee0]: read return 1328
BIO[0x600061080]: write(0,1328) - cipher
BIO[0x600060f60]: write(0,1312) - FILE pointer
BIO[0x600060f60]: write return 1312
BIO[0x600061080]: write return 1328
BIO[0x600060ee0]: read(0,8192) - FILE pointer
BIO[0x600060ee0]: read return 0
BIO[0x600061080]: ctrl(11) - cipher
BIO[0x600061080]: ctrl return 0
bad decrypt
4294956672:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:529:
BIO[0x600060ee0]: Free - FILE pointer
BIO[0x600060f60]: Free - FILE pointer
BIO[0x600061080]: Free - cipher

我該怎么解決?

我發現了錯誤:

encryptor.KeySize = 256;//This line should be removed.

請參閱https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.aescryptoserviceprovider.keysize?view=netframework-4.7.2

更改KeySize值將重置密鑰並生成一個新的隨機密鑰。 每當調用KeySize屬性設置器(包括為其分配相同的值)時,都會發生這種情況。

因此,我不應該手動設置KeySize。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM