【问题标题】:Triple DES encoding-java.security.InvalidKeyException: key size must be 128 or 192 bits三重 DES 编码-java.security.InvalidKeyException:密钥大小必须为 128 或 192 位
【发布时间】:2016-11-20 13:46:21
【问题描述】:

我正在使用下面的代码来实现带有 ECB 和 PKSC5 填充的三重 DES 编码。我使用的密钥存储在原始文件夹中名为 key 的文件中。我遇到了异常-

java.security.InvalidKeyException: key size must be 128 or 192 bits

为什么会出现这个异常,我哪里出错了?

 public byte[] encrypt(String message) throws Exception {

        getResources().getIdentifier("key",
                "raw", getPackageName());
        byte[] bytes = new byte[1024];
        try {
            BufferedInputStream buf = new BufferedInputStream(getResources().openRawResource(
                    getResources().getIdentifier("key",
                            "raw", getPackageName())));
            buf.read(bytes, 0, bytes.length);
            buf.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        final SecretKey key = new SecretKeySpec(bytes, "DESede/ECB/PKCS5Padding");
        final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE,key);

        final byte[] plainTextBytes = message.getBytes("utf-8");
        final byte[] cipherText = cipher.doFinal(plainTextBytes);

        return cipherText;
    }

【问题讨论】:

  • 这个异常再清楚不过了。
  • @Bhuvi 不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机 IV 的 CBC 模式,只需在加密数据前加上 IV 以用于解密。 3DES 也不能用于新作品。

标签: android encryption 3des ecb pkcs#5


【解决方案1】:

您传递了一个长度为 1024 的数组作为密钥。密钥的长度必须为 16(128 位)或 24(192 位)。 1024 不是这些数字。

如果您为读取而过度分配,请在读取后将数组修剪到适当的大小。

【讨论】:

  • 一个 16 字节的密钥可能有效也可能无效,具体取决于实现。 3DES 密钥是 24 字节,OP 使用的实现似乎需要 16 或 24 字节,其中一部分重新用于 16 字节版本。注意,密钥大小为 56 位、112 位和 168 位,每个字节的 lsb 被忽略,它曾经是奇偶校验。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2013-08-23
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多