- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
乍一看,我和很多人有同样的问题。但我的情况有点复杂。
先决条件:
项目语言: Java 11
网络服务器: Orbiwise NS ( https://eu.saas.orbiwise.com/ )
设备:(STM32 + Wifi 模块)通过 Lorawan 网关连接到 Orbiwise,并通过 wifi 使用 TCP 套接字。
输入数据:
从TCP套接字接收到的字节数组:
40 24 fa fa 01 c2 c5 25 03 06 01 43 a4 99 5a c1
85 71 0c 87 38 84 53 9a 80 6c 5a 14 da f8 ff 7c
21 83 8f 78 8e ec f2 7d 4e 4e 07
(43 字节)
在Orbiwise上有与其对应的上行链路负载:
31 19 10 07 01 13 51 25 09 01 00 00 00 00 33 04
00 00 5A 00 00 00 EB 0D 00 00 64 EB
(28字节)
任务:
从 TCP 套接字解密数据,以与 Orbiwise 上相同的格式解密有效负载
使用的方法没有取得积极的结果:
上面的所有项目都是很久以前写的,对我没有帮助。这个有帮助,但是是在 Node JS 上编写的:https://github.com/anthonykirby/lora-packet
从 LoraWan 规范中,我得到了使用 “AES/ECB/NoPadding”
方法,我当前的代码如下所示:
package org.thethingsnetwork.main.java.org.thethingsnetwork.util.security;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Crypto {
/**
* Decrypts TTN data_raw payload to data according to the TTN REST API.
* @param pld encrypted message payload from ttn mqtt message
* @param K the TTN application key
* @param IV
* @return decrypted payload
* @throws Exception
*/
public static byte[] decrypt(byte [] pld, byte [] K, byte [] IV) throws Exception {
byte [] devAddr = getDevAddr(pld);
byte [] frameCounter = getFrameCounter(pld);
byte [] result = initializeResult(pld);
byte [] Ai = new byte[16];
byte [] Si = null;
for(int i = 0; i < result.length; i += 16) {
int blockSeqCnt = (i >> 4) + 1;
computeAi(Ai, devAddr, frameCounter, blockSeqCnt);
Si = encryptAES(Ai, K, IV);
for(int j=0; j < 16 && i+j < result.length; j++) {
result[i+j] ^= Si[j];
}
}
return result;
}
/**
* Converts TTN payload data to data_plain according to the TTN REST API.
* Decode a text using base 64 decoding.
* @param decryptedText
* @return
*/
public static String toPlainText(String decryptedText) {
byte [] data = Base64.getDecoder().decode(decryptedText);
StringBuffer plain = new StringBuffer();
for(int i = 0; i < data.length; i++) {
plain.append((char)data[i]);
}
return plain.toString();
}
public static byte [] getDevAddr(byte [] payload) {
byte [] devAddr = new byte[4];
System.arraycopy(payload, 1, devAddr, 0, 4);
return devAddr;
}
public static byte [] getFrameCounter(byte [] payload) {
byte [] frameCounter = new byte[2];
System.arraycopy(payload, 6, frameCounter, 0, 2);
return frameCounter;
}
public static byte [] initializeResult(byte [] payload) {
byte [] result = new byte[payload.length - 13];
for(int i = 0; i < result.length; i++) {
result[i] = payload[i+9];
}
return result;
}
public static void computeAi(byte [] a, byte [] devAddr, byte [] frameCounter, int blockSeqCnt) {
a[0] = 0x01;
a[1] = 0x00;
a[2] = 0x00;
a[3] = 0x00;
a[4] = 0x00;
a[5] = 0; // 0 for uplink frames 1 for downlink frames;
a[6] = devAddr[0]; // LSB devAddr 4 bytes
a[7] = devAddr[1]; // ..
a[8] = devAddr[2]; // ..
a[9] = devAddr[3]; // MSB
a[10] = frameCounter[0]; // LSB framecounter
a[11] = frameCounter[1]; // MSB framecounter
a[12] = 0x00; // Frame counter upper Bytes
a[13] = 0x00;
a[14] = 0x00;
a[15] = (byte)blockSeqCnt; // block sequence counter 1,2,3...
}
/**
* AES encrpytion.
*/
public static byte[] encryptAES(byte [] data, byte [] key, byte [] iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding", "SunJCE");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec);
return cipher.doFinal(data);
}
}
第二类 - 测试:
package org.thethingsnetwork.util.security;
import org.apache.commons.codec.DecoderException;
import org.junit.Assert;
import org.junit.Test;
import org.thethingsnetwork.main.java.org.thethingsnetwork.util.security.Crypto;
import org.apache.commons.codec.binary.Hex;
public class CryptoTest {
private byte [] SEMTECH_DEFAULT_KEY = Hex.decodeHex("2E12E8BD30FE2FB2D8DE609747D2569F".toCharArray());
public static final byte [] IV = new byte [] {
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
}; // initialization vector – IV
// example data from a ttn message
public static final byte[] TEXT_RAW = new byte[] {0x40, 0x24, (byte) 0xfa, (byte) 0xfa, 0x01, (byte) 0xc2,
(byte) 0xc5, 0x25, 0x03, 0x06, 0x01, 0x43, (byte) 0xa4, (byte) 0x99, 0x5a, (byte) 0xc1, (byte) 0x85, 0x71,
0x0c, (byte) 0x87, 0x38, (byte) 0x84, 0x53, (byte) 0x9a, (byte) 0x80, 0x6c, 0x5a, 0x14, (byte) 0xda,
(byte) 0xf8, (byte) 0xff, 0x7c, 0x21, (byte) 0x83, (byte) 0x8f, 0x78, (byte) 0x8e, (byte) 0xec, (byte) 0xf2,
0x7d, 0x4e, 0x4e, 0x07};
public CryptoTest() throws DecoderException {
}
@Test
public void testDecoder() throws Exception {
byte[] decryptedText = Crypto.decrypt(TEXT_RAW, SEMTECH_DEFAULT_KEY, IV);
printTheByteToString(decryptedText);
}
/**
* Method for prin in command line byte array. For debug necessary
* @param b - input byte array
*/
private void printTheByteToString (byte[] b) {
for (byte val : b) {
System.out.print(String.format("%02x ", val));
}
}
}
我已经检查了代码一百次,但没有得到肯定的结果 - 解密的消息与 Orbiwise 上的不同。
我已经使用 NodeJs 项目 ( https://github.com/anthonykirby/lora-packet ) 检查了数据,一切都是正确的。但无法使用我的 Java 代码解决该任务。
在这种情况下有人可以帮助我吗?预先非常感谢!
最佳答案
您的密文偏移量偏移了 2 个(毫无疑问,因为有 3 个选项字节而不是 1 个)。打印出中间结果或执行头字节的完整解析应该会告诉你这一点,这就是我在评论中提到它的原因。请注意,将 9 的偏移量增加 2 也可能会影响密文大小,因为密文的结尾是固定的。
此外,您正在使用Cipher.DECRYPT_MODE
,而协议(protocol)仅在转发模式下使用密码。计数器模式(由 CCM 和 CCM* 密码使用)仅使用前向模式中的密码,因为它们生成 key 流,然后与明文流或密文流进行异或以分别加密/解密。协议(protocol)中的“解密”部分只是将生成的 key 流与密文而不是明文执行最终的异或。
当然,ECB 模式(在本例中用于简单地实现单 block 加密)不需要 IV,因此该部分代码是虚假的。
关于 java 。 LoraWan 数据包解密。 AES-128,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59502173/
我正在使用多个 LoRaWAN 平台,我很困惑,因为不同的平台处理 AppEUI 的方式不同。 The Things Network 在我创建应用程序时自动生成应用程序 eui。但是,橙色没有。Ora
大多数 LoRaWAN 节点没有电池供电的 RTC(实时时钟)。唯一可用的时钟是 Controller 中的“自启动以来的时间”计数器。尽管 LoRaWAN 数据包在网关收到时带有时间戳,但节点上的事
乍一看,我和很多人有同样的问题。但我的情况有点复杂。 先决条件: 项目语言: Java 11 网络服务器: Orbiwise NS ( https://eu.saas.orbiwise.com/ )
我正在尝试使用 RFM95W 和 STM32L476 来实现 LoRaWAN 和模块之间的通信。我面临的问题是,没有用于处理 OTAA 的库,而且我无法找到任何相关来源来了解它的外观或工作原理。现在我
我试图从 LoRaWAN 1.2 specification 中了解三个神奇的 LoRaWAN ID。 .我的理解是: DevEUI就像一个 MAC 地址 AppKey就像一个公钥(大约...) Ap
在使用 LoRaWAN 的发现板 STM32L0 上研究停止模式几天后,我来到了那里。 我尝试生成一个什么都不做的新项目,按照数据表使用 RTC 测试停止模式并测量电流消耗。我在执行此操作时遇到了一些
我正在阅读 the QuantumLeap docs我想知道这些通用启用程序是如何集成的,我的意思是,我已经部署了 docker 容器并且显然都在运行,事实上我已经能够使用我的 POST 请求在 Io
我正在构建一个 LoRa 网络,其中服务器和终端设备需要使用通常通过 UDP 传输数据的协议(protocol)进行通信。由于这两个协议(protocol)的行为完全不同,我需要找到一种方法将这两者结
我已成功将 TTN theThingsNetwork 与我的 LoRaWAN 网关集成。此外,我还可以将数据从节点转发到 ThingsNetwork。现在我正在寻找信息以从 TTN Thethings
我肯定在阅读 LoRaWAN 规范时漏掉了一些东西,因为这似乎太糟糕了,不可能是真的。请告诉我我神志不清:) 当我有很多 OTAA 节点时,我的测试台似乎会发生以下情况,但我不知道什么会阻止它: 我的
我是一名优秀的程序员,十分优秀!