Base64 编码后的 DES 加密给出不同的结果

如何解决Base64 编码后的 DES 加密给出不同的结果

我有一个 Java BMS 应用程序,其中包含在 RPi 上运行的 Java 客户端。但是,我喜欢将 Arduino 单元添加到系统中,因为它们更简单,但最好使用相同的通信协议。

我使用 DES 加密一个 JSON,然后使用 Base64 对其进行编码。

    DESKeySpec keySpec = new DESKeySpec(encryptionKey.getBytes("UTF8"));
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey key = keyFactory.generateSecret(keySpec);
    byte[] cleartext = data.getBytes("UTF8");
    Cipher cipher = Cipher.getInstance("DES"); // cipher is not thread safe
    cipher.init(Cipher.ENCRYPT_MODE,key);
    byte[] finalByte = cipher.doFinal(cleartext);
    return Base64.encodeBase64String(finalByte);

对于以下 JSON,这将导致字节(作为十六进制):

json: {"result":"SUCCESS","message":"(none)","actions":[{"action":"campAlarm","value":"false"},{"action":"warningBeep",{"action":"gpio_21","value":0}]}
Encrypted: 1e64fd8c074b2eda044f2ed820dab06949e5a2c5602918b13779e906c2733c1719965a456e2127fef0c910cbbbfcd137c535c9423cc14e7e757ddbe9f74ea307d7584eed404e31ff4cb069c40b2464eff5a6705666900a5706950b87df995e8252ed2dfb1070287c080a3527b3c40a2749c2982d033279b827cde81829d2a8d7568808caa6604a32ef41fe9b1a2fdbd3e79d5107938e6b179100c7f542cfe8cb433750ea38954bd9
Base64 encoded: HmT9jAdLLtoETy7YINqwaUnlosVgKRixN3npBsJzPBcZllpFbiEn/vDJEMu7/NE3xTXJQjzBTn51fdvp906jB9dYTu1ATjH/TLBpxAskZO/1pnBWZpAKVwaVC4ffmV6CUu0t+xBwKHwICjUns8QKJ0nCmC0DMnm4J83oGCnSqNdWiAjKpmBKMu9B/psaL9vT551RB5OOaxeRAMf1Qs/oy0M3UOo4lUvZ

但是,我在处理这个特定的 json 字符串时遇到了困难(并非所有情况都会发生)。 Base64编码前的服务器加密数据中有额外的零(读取HEX),在Arduino上用Base64解码后没有(结果是带有Base64编码数据的字符串):

  char encoded[result.length()];
  result.toCharArray(encoded,result.length());

  // Convert back.
  int decodedLength = Base64.decodedLength(encoded,sizeof(encoded));
  char decodedChar[decodedLength];
  Base64.decode(decodedChar,encoded,sizeof(encoded));
  Serial.print("Decoded: "); des.printArray((byte*) decodedChar,decodedLength);
  for (int i = 0; i < decodedLength; i += 8) {
    byte intermitInput[8];
    for (int j = 0; j < 8; j++) {
      intermitInput[j] = (byte) decodedChar[i + j];
    }
    Serial.print(i);Serial.print(" ");
    des.decrypt((byte*)decodedChar + i,intermitInput,(byte*)key); // Re-use the decodedChar array as it is already initiated (saving money)
  }
  Serial.println("Finished decription.");
  decodedChar[decodedLength] = '\0';
  Serial.print("Decripted: "); des.printArray((byte*) decodedChar,(int) sizeof(decodedChar));
  Serial.print("Decripted result:\t");
  Serial.println(decodedChar);

结果:

Base64 decoded: 1e64fd8c74b2eda44f2ed820dab06949e5a2c5602918b13779e96c2733c1719965a456e2127fef0c910cbbbfcd137c535c9423cc14e7e757ddbe9f74ea37d7584eed404e31ff4cb069c4b2464eff5a670566690a57695b87df995e8252ed2dfb1070287c8a3527b3c4a2749c2982d33279b827cde81829d2a8d756888caa6604a32ef41fe9b1a2fdbd3e79d517938e6b17910c7f542cfe8cb433750ea38954bbf
DES decrypted: 7b22726573756c74223a2253554343455353222c226d657373616765223a22286e6f6e6529222c2022616374696f6e73223a5b7b22616374696f6e223a2263616d70416c61726d222c2276616c7565223a2266616c7365227d2c7b22616374696f6e223a227761726e696e6742656570222c2276616c7565223a2266616c7365227d2c7b22616374696f6e223a226770696f5f3231222c2276616c7565223a30d8e9d029b7c75ed1
json:   {"result":"SUCCESS","value":0⸮⸮⸮)⸮⸮^⸮

我猜这是因为 Base64 解码后“缺少”“0”(在十六进制中),如果 json 关闭,则最后 8 个字符。这只是一个猜测,因为我不知道那些“0”十六进制“字符”丢失的原因。 (例如 1e64fd8c07 与 1e64fd8c7)

有人知道这是怎么发生的吗?有趣的是,除了最后一组 8 个字节之外,字符串被正确解密。该字符串为 163 个字符,因此在编码时进行填充。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res