使用AesCryptoServiceProvider解密而不使用IV

时间:2012-03-14 10:33:19

标签: c# .net encryption aes

我编写了一个使用AES加密的BlackBerry应用程序。我试图使用C#中的AesCryptoServiceProvider解密它。

BlackBerry代码似乎没有使用IV,这意味着我无法传递给AesCryptoServiceProvider。

我可以在没有IV的情况下解密AES,如果是的话,怎么做?

1 个答案:

答案 0 :(得分:1)

阅读黑莓java加密文档,看来你不应该直接使用AESEncryptionEngine。如果你直接使用它,你最终得到(我假设)ECB模式,这导致企鹅图像的以下加密。不要这样做。

Bad Encryption 相反,似乎要使用某种安全操作模式,您需要实际使用基本AESEncrypt / Decrypt Engine的包装器。您想使用CBCEncryptionEngine来执行此操作。以下是here的一些示例代码。请注意,IV在创建时是随机的,因此您无需设置它或担心重用。这里只需用AES替换DES。

// sampleDESCBCEncryption
private static int sampleDESCBCEncryption( 
    byte[] secretKey, byte[] initVector, byte[] plainText, byte[] cipherText, int
    dataLength ) 
    throws CryptoException, IOException
{
    // Create a new DES key based on the 8 bytes in the secretKey array
    DESKey key = new DESKey( secretKey );

    // Create a new initialization vector using the 8 bytes in initVector
    InitializationVector iv = new InitializationVector( initVector );

    // Create a new byte array output stream for use in encryption
    NoCopyByteArrayOutputStream out = new NoCopyByteArrayOutputStream();

    // Create a new instance of a BlockEncryptor passing in an instance of a CBC encryptor engine
    // (containing an instance of a DES encryptor engine), the initialization vector, and the
    // output stream
    BlockEncryptor cryptoStream = new BlockEncryptor( 
        new CBCEncryptorEngine( new DESEncryptorEngine( key ), iv ), out );

    // Write dataLength bytes from plainText to the CFB encryptor stream
    cryptoStream.write( plainText, 0, dataLength );
    cryptoStream.close();

    // Now copy the encrypted bytes from out into cipherText and return the length
    int finalLength = out.size();
    System.arraycopy( out.getByteArray(), 0, cipherText, 0, finalLength );
    return finalLength;
}