C#AES-256加密 [英] C# AES-256 Encryption

查看:166
本文介绍了C#AES-256加密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用RijndaelManaged的做一个简单的加密/解密工具。这是工作正常,但我试图把它与它在Unix中(甲骨文)创造了另一个程序集成。我的问题是,所有的小输入字符串,我得到完全相同的加密的十六进制作为Unix的代码生成,但对于更长的字符串,我的加密的十六进制的一半是相同的,但另一半是不同的:

I am using RijndaelManaged to make a simple encryption/decryption utility. This is working fine, but I am trying to get it integrated with another program which is created in Unix (Oracle). My problem is, for all smaller input string, i am getting the exact same encrypted hex as the Unix code is generation, but for longer strings, half of my encrypted hex is same, but the other half is different:

Unix的输出:

012345678901234 - 00984BBED076541E051A239C02D97117 
0123456789012345678 - A0ACE158AD8CF70CEAE8F76AA27F62A30EA409ECE2F7FF84F1A9AF50817FC0C4

视窗输出(我的代码):

Windows Output (my code):

012345678901234 - 00984BBED076541E051A239C02D97117 (same as above)
0123456789012345678 - A0ACE158AD8CF70CEAE8F76AA27F62A3D9A1B396A614DA2C1281AA1F48BC3EBB (half exactly same as above)

我的Windows代码是:

My Windows code is:

public string Encrypt(byte[] PlainTextBytes, byte[] KeyBytes, string InitialVector)
        {
            byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
            RijndaelManaged SymmetricKey = new RijndaelManaged();
            SymmetricKey.Mode = CipherMode.ECB;
            SymmetricKey.Padding = PaddingMode.PKCS7;
            ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes);
            MemoryStream MemStream = new MemoryStream();
            CryptoStream CryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write);
            CryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
            CryptoStream.FlushFinalBlock();
            byte[] CipherTextBytes = MemStream.ToArray();
            MemStream.Close();
            CryptoStream.Close();
            return ByteToHexConversion(CipherTextBytes);
        }



UNIX(PL / SQL)代码:

Unix (PL/SQL) code:

FUNCTION Encrypt_Card (plain_card_id  VARCHAR2)
    RETURN RAW AS
    	num_key_bytes      NUMBER := 256/8;        -- key length 256 bits (32 bytes)
    	encrypted_raw      RAW (2000);             -- stores encrypted binary text
    	encryption_type    PLS_INTEGER :=          -- total encryption type
    				    DBMS_CRYPTO.ENCRYPT_AES256
    				  + DBMS_CRYPTO.CHAIN_CBC
    				  + DBMS_CRYPTO.PAD_PKCS5;

    	key_bytes_raw  RAW(64) :=my_hex_key;
    BEGIN



     encrypted_raw := DBMS_CRYPTO.ENCRYPT
           (
              src => UTL_I18N.STRING_TO_RAW (plain_card_id, 'AL32UTF8'),
              typ => encryption_type,
              key => key_bytes_raw
           );


      RETURN encrypted_raw;
    EXCEPTION
    WHEN OTHERS THEN
    dbms_output.put_line (plain_card_id || ' - ' || SUBSTR(SQLERRM,1,100) );
    RETURN HEXTORAW ('EEEEEE');



我看到的唯一区别是使用PKCS5和PCKS7的。但是,.NET没有PCKS5。

The only difference i see is use of PKCS5 and PCKS7. But, .NET doesn't have PCKS5.

推荐答案

什么ABC说,你也似乎没有任何IV(初始化向量)在你Unix程序代码在所有。

What abc said and also you don't seem to have any IV (Initialization Vector) in you Unix code at all.

这第一部分是相同的具有与不同的模式(ECB和CBC)做的事实。欧洲央行分别加密每个块,而CBC加密在下单时使用以前的块。

The fact that the first part are the same has to do with the different modes (ECB and CBC). ECB encrypts each block separately while CBC uses the previous block when encrypting the next one.

这里发生的是,因为你使用CBC和不设置IV的IV为全零。

这意味着,第一个块欧洲央行加密和CBC加密将是相同的。

(因为XOR 0 = A)。

What happens here is that since you use CBC and do not set an IV the IV is all zeroes.
That means that the first block of ECB encryption and CBC encryption will be the same.
(Since A XOR 0 = A).

您需要确保您使用在两个系统中相同的加密方式,如果你决定CBC确保您使用相同的IV。

You need to make sure you use the same encryption mode in both systems and if you decide on CBC make sure you use the same IV.

这篇关于C#AES-256加密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆