Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#AES-256加密_C#_Unix_Encryption_Rijndaelmanaged - Fatal编程技术网

C#AES-256加密

C#AES-256加密,c#,unix,encryption,rijndaelmanaged,C#,Unix,Encryption,Rijndaelmanaged,我正在使用RijndaelManaged制作一个简单的加密/解密实用程序。这工作正常,但我正在尝试将其与在Unix(Oracle)中创建的另一个程序集成。我的问题是,对于所有较小的输入字符串,我得到的加密十六进制数与生成的Unix代码完全相同,但对于较长的字符串,我的加密十六进制数的一半相同,但另一半不同: Unix输出: 012345678901234 - 00984BBED076541E051A239C02D97117 0123456789012345678 - A0ACE158AD8CF

我正在使用RijndaelManaged制作一个简单的加密/解密实用程序。这工作正常,但我正在尝试将其与在Unix(Oracle)中创建的另一个程序集成。我的问题是,对于所有较小的输入字符串,我得到的加密十六进制数与生成的Unix代码完全相同,但对于较长的字符串,我的加密十六进制数的一半相同,但另一半不同:

Unix输出:

012345678901234 - 00984BBED076541E051A239C02D97117 
0123456789012345678 - A0ACE158AD8CF70CEAE8F76AA27F62A30EA409ECE2F7FF84F1A9AF50817FC0C4
Windows输出(我的代码):

我的Windows代码是:

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)代码:


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

您在一种情况下使用ECB,在另一种情况下使用CBC。

abc所说的,而且您的PL/SQL代码中似乎根本没有任何IV(初始化向量)

第一部分相同的事实与不同的模式(ECB和CBC)有关。ECB分别加密每个块,而CBC在加密下一个块时使用上一个块

这里发生的情况是,由于您使用CBC,并且没有设置IV,因此IV都是零。
这意味着ECB加密和CBC加密的第一个块将是相同的。
(因为XOR 0=A)


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

如果我在.NET代码中使用CBC,则对于所有输入字符串(大小),它会给出完全不同的结果。当然,是这样。CBC使用随机生成的IV。使用不同的IV加密两次,得到不同的结果。那不是虫子。这就是CBC的工作原理。实际上,CBC不使用随机静脉注射。欧洲央行根本不使用静脉注射。不同之处在于,在CBC中,在加密之前,前一个加密块与下一个明文块是异或的。所以CBC需要对第一个明文块进行IV-to-XOR,因为在第一个明文块之前没有块。哦,我明白了。你应该随机生成一个IV。真的。(你的意思是CBC使用内部生成的随机IV)。IV必须始终存储/传输到解密程序,并且不是秘密。不。。。您应该将IV与加密数据一起发送。没有必要对静脉注射保密。但重要的是,不要使用同一个IV用同一个密钥加密不同的数据。谢谢,这解释了很多。但是,当我使用CBC时,为什么我的输出加密十六进制与Unix代码生成的加密十六进制不同,即使对于较小的输入字符串也是如此。从逻辑上讲,它应该是相同的,因为它使用相同的键、IV和模式(即CBC)。如果在.NET上使用IV,而在Unix上没有设置任何IV,那么IV就不一样了。正如我提到的,我看不到您在Unix代码中的任何地方设置了IV。在PL/SQL(“Unix”)代码中使用IV:
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);
        }
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');