【发布时间】:2017-09-03 20:35:13
【问题描述】:
我被要求使用 RSA 加密在蓝牙节点之间发送数据,这是我研究任何形式的加密的第一周,所以我需要一些帮助。
似乎输出大小总是相对于模数的大小。 Mod 2048 和 1024 似乎很流行,它们分别具有 256 字节和 128 字节的输出大小。
我正在使用仅接受大小为 20(字节)的数据包的低功耗蓝牙(蓝牙智能)节点。
我的问题:如果我只能发送 20 个字节,加密数据有什么意义吗?我认为将 20 个字节的数据加密为 20 个字节是不合理的……这算不上什么加密。我什至不确定是否可以设置一个 160 的模数来加密它?如果您想知道,为什么模数是 160?这是因为如果 (2048 / 8 = 256 字节),则 (160 / 8 = 20 字节)。
新信息: 我无法发送多个数据包,因为该系统是网状系统。也就是说,每次我发送一个数据包时,节点都会断开与发送者的连接,然后将消息广播到空中的任何节点。我大约需要 4 秒才能发送第二个数据包。
到目前为止,我已经编写了一些测试代码,只是为了弄脏我的手并检查加密 20 字节的默认输出(最终输出为 256 字节)。
public class Encryption {
// Possibly use files for saving keys
private static String PUBLIC_KEY_FILE = "Public.key";
private static String PRIVATE_KEY_FILE = "Private.key";
Key publicKey = null;
Key privateKey = null;
KeyPairGenerator kpg;
KeyPair kp;
Cipher cipher;
public Encryption() {
try {
kpg = KeyPairGenerator.getInstance("RSA");
kp = kpg.generateKeyPair();
publicKey = kp.getPublic();
privateKey = kp.getPrivate();
} catch (Exception e) {
Log.e("Encryption", "RSA KeyPair Error...");
e.printStackTrace();
}
}
// Encode
public byte[] encode(byte[] bytesToEncode) {
byte[] encodedBytes = null;
try {
// Basic Cipher (mode/padding excluded for now)
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
encodedBytes = cipher.doFinal(bytesToEncode);
} catch (Exception e) {
Log.e("Encryption", "RSA Encoding Error...");
e.printStackTrace();
}
return encodedBytes;
}
public byte[] decode(byte[] encodedBytes) {
byte[] decodedBytes = null;
try {
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
decodedBytes = cipher.doFinal(encodedBytes);
} catch (Exception e) {
Log.e("Encryption", "RSA Decoding Error...");
e.printStackTrace();
}
return decodedBytes;
}
}
正如您在我的全局变量中看到的那样,稍后我将不得不更改代码以在某些时候保存这些密钥,而不是每次都重新创建它们,因此我总是使用相同的密钥对。此外,我需要将公钥文件提供给编写节点固件的工程师,以便他可以解码我的加密。由于我严格使用字节,所以我不应该遇到字符集问题。
【问题讨论】:
-
"只接受大小为 20(bytes) 的数据包..." 所以发送多个数据包。您在这里似乎也没有问题。
-
@JamesKPolk 请查看我添加的信息。我也强调了这个问题。由于我使用的是网状系统,因此我无法流式传输数据或同时发送数据包。当向我的一个节点发送数据包时,该节点从接收到发送,这会终止连接。我需要大约 4 秒才能再次“看到”蓝牙节点。
-
160 位 RSA 提供的安全性如此之低,以至于打扰都毫无意义。 160 位椭圆曲线密码学要强大得多,但仍远低于当代标准。不幸的是,您的要求非常有限。
-
@JamesKPolk 谢谢。我想我只是在寻找第二种意见,因为我对密码学知之甚少。请发布答案,以便我接受并给予您适当的信任。
-
我建议您在 crypto.stackexchange.com 上提问,而不是发布答案。与其发布您的代码,不如简单地提及您的要求。他们那里有很多专家,其中一些人可能在网状网络/资源受限的密码学方面有经验。
标签: android encoding bluetooth cryptography rsa