16字节三重DES解密无效密钥

2024-01-11

我有一个 Android 项目,其中从我的 Web 服务获取 Triple DES 加密的文本片段。我需要 Triple DES 解密。

但是,我收到无效的关键异常。我的密钥已转换为十六进制格式,但出现错误:W/System.err﹕ java.security.InvalidKeyException: DES key too long - should be 8 bytes我发现here https://community.oracle.com/thread/1528631解释十六进制可能导致问题的论坛

“DES 密钥是 56 位,通常封装在 8 个字节中,因此他们给您的 16 个字节/字符很可能是密钥的十六进制编码字节。您可以获得十六进制解码器”

所以我使用将十六进制字符串转换为字节数组

 private static byte[] hexStringtoByteArray(String hex){
        int len = hex.length();

        byte [] data = new byte[len/2];
        for(int i=0; i<len;i+=2){
            data[i/2] = (byte)((Character.digit(hex.charAt(i), 16)<<4) + Character.digit(hex.charAt(i+1),16));
        }
        return data;
    }

并将其传递给密码,我收到一个错误:

W/System.err﹕ java.security.InvalidKeyException
W/System.err﹕ at javax.crypto.spec.DESedeKeySpec.

这是我的解密方法。如果有人能指出我可能出错的地方,我将不胜感激。

 public String DesDecryptPin(String pin, String encryptKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {

    String UNICODE_FORMAT = "UTF8";
    String decryptedPinText = null;

    byte[] hexConvert = hexStringtoByteArray(encryptKey);

    SecretKey desKey = null;
    KeySpec desKeySpec = new DESedeKeySpec(hexConvert); // Exception HERE
    Cipher desCipher;
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DESede");
    desCipher = Cipher.getInstance("DES/ECB/NoPadding");
    try {
        desKey = skf.generateSecret(desKeySpec);
    } catch (InvalidKeySpecException e) {
        e.printStackTrace();
    }

    desCipher.init(Cipher.DECRYPT_MODE, desKey);
    byte[] decryptPin = desCipher.doFinal(pin.getBytes());
    decryptedPinText = new String(decryptPin, "UTF-8");

    return decryptedPinText;
}

我的密钥是C9AF269DF8A78A06D1216BFFF8F0536A。

我已与客户端核实,密钥是正确的,因此使用相同的密钥进行加密。

加密代码

 public string TripleDESEncrypt(string strClearText, string strKey)
    {
        byte[] bytClearText;
        byte[] bytClearTextChunk = new byte[8];
        byte[] bytEncryptedChunk = new byte[8];
        int BytesCount = 0;
        int nArrayPosition = 0;
        string strEncryptedChar;
        string strEncryptedText = "";

        ArrayList Input = new ArrayList();
        ArrayList Output = new ArrayList();

        TripleDESCryptoServiceProvider tdes = (TripleDESCryptoServiceProvider)TripleDESCryptoServiceProvider.Create();

        tdes.Key = HexToByteArray(strKey);
        tdes.Mode = CipherMode.ECB;

        ICryptoTransform tdesEncrypt = tdes.CreateEncryptor();

        bytClearText = ASCIIEncoding.ASCII.GetBytes(strClearText);
        BytesCount = bytClearText.Length;

        for (int i = 0; i < BytesCount; i++)
        {
            if (nArrayPosition == 8)
            {
                Input.Add(bytClearTextChunk);
                bytClearTextChunk = new byte[8];
                nArrayPosition = 0;
            }
            bytClearTextChunk[nArrayPosition] = bytClearText[i];
            nArrayPosition++;
        }

        if (nArrayPosition != 0)
            Input.Add(bytClearTextChunk);


        foreach (byte[] Cbyte in Input)
        {
            tdesEncrypt.TransformBlock(Cbyte, 0, 8, bytEncryptedChunk, 0);
            Output.Add(bytEncryptedChunk);
            bytEncryptedChunk = null;
            bytEncryptedChunk = new byte[8];
        }


        foreach (byte[] Cbyte in Output)
        {
            foreach (byte BByte in Cbyte)
            {
                strEncryptedChar = BByte.ToString("X");
                strEncryptedChar = strEncryptedChar.PadLeft(2, Convert.ToChar("0"));
                strEncryptedText += strEncryptedChar;
            }
        }

        return strEncryptedText;
    }

以下是包含 14 个字符的解密文本的示例:12345678901234


DES 期望一个 8 字节密钥(带奇偶校验)。因此 Triple DES 需要 24 字节密钥(带奇偶校验)。由于您只有 16 字节密钥,因此您必须复制其中的一部分才能获得最终密钥。通常第一个和最后 8 个字节是相同的。您可以尝试两种变体:

byte[] tdesKey = new byte[24];
System.arraycopy(hexConvert, 0, tdesKey, 0, 16);
System.arraycopy(hexConvert, 0, tdesKey, 16, 8);
// tdesKey := K1 || K2 || K1

or

byte[] tdesKey = new byte[24];
System.arraycopy(hexConvert, 8, tdesKey, 0, 8);
System.arraycopy(hexConvert, 0, tdesKey, 8, 16);
// tdesKey := K2 || K1 || K2

when

hexConvert := K1 || K2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

16字节三重DES解密无效密钥 的相关文章

随机推荐

  • 如何从 AngularJS 访问 Heroku 上的环境变量

    我在 Heroku 上有 3 个 AngularJS 应用程序 他们每个人都使用不同的 API 例如 angularjs dev 使用 api dev angularjs qa 使用 api qa 我创建了如下所示的常量文件 SITE de
  • jQuery fadeIn fadeOut 点击

    我试图在单击另一个 div 时使 div 淡入 并在单击另一个 div 时再次淡出 这将是关闭按钮 但我的代码不起作用 我是否忘记了什么 这是 CSS body margin 0 padding 0 text align center ba
  • 编写 Django 脚本

    使用 Django 设置 模型 实用程序等编写 python 脚本 不在 Django 服务器应用程序中运行 的最佳方法是什么 从而能够通过批处理过程对应用程序数据库进行操作 EDIT 我需要在另一台服务器中使用它来对数据库进行相当复杂的操
  • 不希望 mysql 自动将 String 转换为 Integer

    我发现 MYSQL 从 String 到 Integer 的自动类型转换在我看来很奇怪 mysql gt select from isps where id 3ca6fb49 9749 3099 b30d 19ce56349ad6 OR u
  • 为单例类制作装饰器——typescript

    我正在使用 VueJS 和 Typescript 构建一个项目 我觉得使用服务而不是像 Vuex 这样的任何状态管理库很舒服 但是在编写服务时 我必须始终在每个服务类中复制粘贴一些代码 以使其成为单一的 class MyService pr
  • 如何在 Android 中获取 Facebook 上的所有照片

    我正在开发一个应用程序 其中我将 Facebook SDK 用于不同的目的 目前我已经实现了通过Facebook登录 现在我的下一个任务是获取登录用户的所有照片并将其显示在网格中 我正在关注 Facebook 官方开发者网站作为此任务的参考
  • 使用 img srcset 处理响应式图像

    我将 Angular 与材质一起使用 并使用 img srcset 来处理标题的响应图像 这就是我到目前为止正在做的事情 img src assets mtn bg 1600 jpg alt Header image 我对如何使用 srcs
  • TASM:乘法后如何在屏幕上打印寄存器对 dx:ax?

    include io h cr equ 0dh lf equ 0ah stacksg segment stack dw 100 dup stacksg ends datasg segment prp1 db 1st Number cr lf
  • 浏览器后退按钮

    我使用以下代码行来禁用注销后浏览器后退按钮问题 function LogoutOnClick window history go 1 但是 这段代码有一个问题 假设我有三页 第一页是登录页面 login cshtml 和第二个成功登录页面
  • 使用 C# 远程更改 Windows Server 2008 计算机的计算机名称?

    也许有人能够向我指出一个决定性的资源 以了解如何使用 C 在 Windows Server 2008 计算机上远程更改计算机名称 我已经查看了很多网站寻求帮助 现在在我的任务的第二天 并没有真正接近 除了决定 WMI 几乎是我唯一的选择 完
  • 模板化转换构造函数无法访问受保护的数据成员

    我有一个带有转换构造函数的模板类 矩形 它允许在 矩形 到 矩形 之间进行转换 反之亦然 但是在编译代码时 编译器会给出错误 指出构造函数无法访问类的受保护成员 这是代码 include
  • Internet Explorer Web 开发人员工具栏是否可以使用弹出窗口?

    我无法让 Internet Explorer Web 开发人员工具栏与弹出窗口一起使用 它不会在弹出窗口的底部呈现 有什么建议么 有一个very具体方法是 open the developer tools via F12 or whatev
  • 忽略标点符号并突出显示给定字符串中的模式

    我有一个模型字符串和匹配模式列表 我想突出显示给定模型字符串中的所有匹配模式 即使模式 模型中的任何单词包含标点符号 示例字符串 Lorem Ipsum is simply dummy text of the printing and ty
  • 为什么 Perl 有一个单独的“perl”编译器和“perlcc”前端?

    我试图用我的 Perl 代码制作一个可执行文件 然后我意识到没有这样的选项可用perl编译器 经过一番搜索 我发现perlcc http search cpan org dist B C script perlcc PL 它是 Perl 编
  • 在 Meteor.js 中,为什么 this.userId == 未定义?

    我正在通过阅读一本书来学习 Meteor 现在我们想要insert the userId当前登录的用户的 Template categories events keyup add category function e t if e whi
  • 为基于 Web 的应用程序实现自动提醒电子邮件功能

    我想为我的 Web 应用程序创建一个功能 一旦用户输入我的数据库 每 4 周就会向他们发送一封电子邮件 提醒他们提供一些反馈等 我听说 cron 工作就是我正在寻找的 但我很好奇还有什么 是否有一个 php 脚本存在或者有一个简单的方法来做
  • 在 AWS Step Functions Parallel 状态下,如果一个分支失败,是否有办法确保其他分支继续运行直至完成?

    我有一个具有并行状态的步进函数 该函数有四个分支 A B C D 每个分支都有 3 个 Glue StartJobRun 任务状态 如果分支 A 在第一个任务期间失败 我如何确保其他分支在成功后继续执行其任务 正如您在 AWS Step F
  • 将 TAG 格式转换为语料库的正则表达式

    我正在使用一个名为 AntConc 的语料库语言学工具 其中有一个文档 其中每个单词都被标记为词性 名词 形容词等 并且您可以使用特定的命令来提取匹配项 例如 如果我正在寻找一个名词 标记为 NN 我会使用 NN它会找到文档中的每个名词 我
  • jQuery 日期选择器宽度

    我不明白为什么这这么难做到 关于 jQuery 的一切都如此简单 如何设置 jQuery display inline 的宽度日期选择器 我已经编辑了 jquery ui css 但是一旦我更改月份 它就会重置宽度 我希望这只是我错过的一些
  • 16字节三重DES解密无效密钥

    我有一个 Android 项目 其中从我的 Web 服务获取 Triple DES 加密的文本片段 我需要 Triple DES 解密 但是 我收到无效的关键异常 我的密钥已转换为十六进制格式 但出现错误 W System err java