6

RijndaelManagedを使用して、単純な暗号化/復号化ユーティリティを作成しています。これは正常に機能していますが、Unix(Oracle)で作成された別のプログラムと統合しようとしています。私の問題は、すべての小さい入力文字列について、Unixコードが生成するのとまったく同じ暗号化された16進数を取得していますが、長い文字列の場合、暗号化された16進数の半分は同じですが、残りの半分は異なります。

Unix出力:

012345678901234 - 00984BBED076541E051A239C02D97117 
0123456789012345678 - A0ACE158AD8CF70CEAE8F76AA27F62A30EA409ECE2F7FF84F1A9AF50817FC0C4

Windows出力(私のコード):

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

私の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)コード:

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がありません。

4

2 に答える 2

12

abcが言ったことと、PL / SQLコードにIV(初期化ベクトル)がまったく含まれていないようです。

最初の部分が同じであるという事実は、異なるモード(ECBとCBC)と関係があります。ECBは各ブロックを個別に暗号化しますが、CBCは次のブロックを暗号化するときに前のブロックを使用します。

ここで何が起こるかというと、CBCを使用し、IVを設定しないため、IVはすべてゼロになります。
つまり、ECB暗号化とCBC暗号化の最初のブロックは同じになります。
(A XOR 0 = Aであるため)。

両方のシステムで同じ暗号化モードを使用していることを確認する必要があります。CBCを決定する場合は、同じIVを使用していることを確認してください。

于 2009-07-03T12:30:48.073 に答える
3

1つのケースではECBを使用し、他のケースではCBCを使用します。

于 2009-07-03T12:30:33.207 に答える