2

我有一个问题。在我的应用程序中,我使用 AES 加密和解密。当我加密数据并将其发送到服务器端时,它会显示一些垃圾字符添加到加密数据中。但是怎么做?

实际上,这个加密数据是从我这边完美解密的,但是服务器接收到的时候有垃圾字符。

这是我的加密代码:

public static  byte[] encrypt( byte[] keyData, byte[] data )
throws CryptoException, IOException
{
    // Create the AES key to use for encrypting the data.
    // This will create an AES key using as much of the keyData
    // as possible.

    AESKey key = new AESKey( keyData );

    // Now, we want to encrypt the data.
    // First, create the encryptor engine that we use for the actual
    // encrypting of the data.
    AESEncryptorEngine engine = new AESEncryptorEngine( key );

    // Since we cannot guarantee that the data will be of an equal block
    // length we want to use a padding engine (PKCS5 in this case).
    PKCS5FormatterEngine fengine = new PKCS5FormatterEngine( engine );

    // Create a BlockEncryptor to hide the engine details away.
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    BlockEncryptor encryptor = new BlockEncryptor( fengine, output );

    encryptor.write( data );

    encryptor.close();
    output.close();

    return output.toByteArray();
}

请注意,我无权访问服务器上的解密逻辑。

4

2 回答 2

3

我不完全清楚您是在服务器端解密,还是仅仅因为字节数比原始数据多而称它们为垃圾字符。如果总是添加 16 个或更少的字节,那么这就是 PKCS5 填充,用于使您的数据可被密码的块大小整除。解密后不可见,因为解密器会自动剥离垫。

但是,查看 Blackberry 文档,我建议您更改加密,因为 BlockEncryptor 默认为 ECB 模式。这是一种很容易泄露明文信息的操作模式。相反,请选择 BlockEncryptor 的子类,例如CBCEncryptorEngine。您需要将 IV 与您的密文一起传输,以便稍后在此模型中进行解密。

在使用 Blackberry 提供的结构实现加密时要非常非常小心。很容易出错(比如使用 ECB),并且生成的密文可能看起来很好,但从根本上被破坏了。

于 2013-07-25T13:15:49.837 回答
0

当然,问题可能出在您没有显示的解密代码中。您很可能在解密期间不使用填充模式。因此,填充字符被视为纯文本。它们可能包含字节值,例如:

01
0202
030303

这称为PKCS#5 填充或 PKCS#7 填充。它已由您在加密期间指定 ( PKCS5FormatterEngine)。

这些应该在解密后在服务器端删除。如果可能,请使用库来执行此操作。始终添加 PKCS#5 填充,因此也可以自己删除填充字节非常简单。不可打印的字符


正如您在对答案的评论中指出的那样,如果您无法更改服务器端,那么您应该将客户端更改为使用零字节填充。这只是向纯文本添加零字节,直到您可以将纯文本除以块大小。您可能必须手动执行此操作。似乎服务器端只是简单地解密了纯文本,然后它可能使用以空结尾的字符串,或者它“修剪”纯文本,删除任何空格(包括终止字符)。然后加密,但PKCS5FormatterEngine当然不使用。


请注意,PKCS#5 和零字节填充都不会增加真实性或完整性,如果您使用 ECB/CBC 加密和这种填充,那么您很可能容易受到填充 oracle 攻击。以每字节明文 128 次尝试检索明文。

于 2013-08-06T13:32:40.727 回答