Android Studio/Java-具有较小输入/输出大小的RSA加密

Android Studio/Java-具有较小输入/输出大小的RSA加密,android,encoding,bluetooth,cryptography,rsa,Android,Encoding,Bluetooth,Cryptography,Rsa,我被要求使用RSA加密在蓝牙节点之间发送数据,这是我第一周研究任何形式的加密,所以我需要一些帮助 似乎输出大小始终与模数的大小有关。MOD2048和1024似乎很流行,它们分别有256字节和128字节的输出大小 我正在使用蓝牙低能量(Bluetooth Smart)节点,它只接受大小为20(字节)的数据包 我的问题:如果我只能发送20个字节,加密数据有什么意义吗?我不认为将20字节的数据加密为20字节是合理的……这并不是什么加密。我甚至不确定是否可以设置160的模数来加密这个?如果你想知道,为什

我被要求使用RSA加密在蓝牙节点之间发送数据,这是我第一周研究任何形式的加密,所以我需要一些帮助

似乎输出大小始终与模数的大小有关。MOD2048和1024似乎很流行,它们分别有256字节和128字节的输出大小


我正在使用蓝牙低能量(Bluetooth Smart)节点,它只接受大小为20(字节)的数据包

我的问题:如果我只能发送20个字节,加密数据有什么意义吗?我不认为将20字节的数据加密为20字节是合理的……这并不是什么加密。我甚至不确定是否可以设置160的模数来加密这个?如果你想知道,为什么模数是160?这是因为如果(2048/8=256字节),那么(160/8=20字节)

新信息: 我不能发送多个数据包,因为这个系统是网状系统。也就是说,每次我发送数据包时,节点都会与发送方断开连接,然后将消息广播到空中的任何节点。大约需要4秒钟,我才能发送第二个数据包

到目前为止,我已经编写了一些测试代码,只是为了弄脏我的双手,并检查加密20字节的默认输出(最终是256字节的输出)

公共类加密{
//可能使用文件保存密钥
私有静态字符串PUBLIC\u KEY\u FILE=“PUBLIC.KEY”;
私有静态字符串private\u KEY\u FILE=“private.KEY”;
Key publicKey=null;
密钥privateKey=null;
键对发电机kpg;
密钥对kp;
密码;
公共加密(){
试一试{
kpg=KeyPairGenerator.getInstance(“RSA”);
kp=kpg.generateKeyPair();
publicKey=kp.getPublic();
privateKey=kp.getPrivate();
}捕获(例外e){
Log.e(“加密”,“RSA密钥对错误…”);
e、 printStackTrace();
}
}
//编码
公共字节[]编码(字节[]bytesToEncode){
字节[]encodedBytes=null;
试一试{
//基本密码(暂时不包括模式/填充)
cipher=cipher.getInstance(“RSA”);
cipher.init(cipher.ENCRYPT_模式,privateKey);
encodedBytes=cipher.doFinal(bytesToEncode);
}捕获(例外e){
Log.e(“加密”,“RSA编码错误…”);
e、 printStackTrace();
}
返回编码字节;
}
公共字节[]解码(字节[]编码字节){
字节[]decodedBytes=null;
试一试{
cipher=cipher.getInstance(“RSA”);
cipher.init(cipher.DECRYPT_模式,公钥);
decodedBytes=cipher.doFinal(encodedBytes);
}捕获(例外e){
Log.e(“加密”,“RSA解码错误…”);
e、 printStackTrace();
}
返回解码字节;
}
}

正如您在我的全局变量中所看到的,稍后我将不得不更改代码以在某个点保存这些密钥,而不是每次都重新创建它们,因此我始终使用相同的密钥对。此外,我需要将公钥文件提供给编写节点固件的工程师,以便他能够解码我的加密。因为我严格使用字节,所以我不应该有字符集问题。

您正在尝试重新发明轮子:

  • 您应该只使用RSA对随机生成的密钥进行签名和加密,这些密钥将在您的设备之间共享,而不是交换任何其他类型的数据

  • 然后,您应该使用这些密钥和对称算法来验证和加密设备之间的数据

目前,标准RSA密钥长度约为2048位

目前标准的AES对称密钥长度约为256位

但密钥大小和块大小不同:AES块大小为16字节。这应该适合你的小包

更准确地说,由于您的数据大小可能不完全是16个字节,因此您应该使用分组密码算法(例如CBC)或流密码算法(例如GCM),以便使用AES或其他对称算法处理您的数据

最先进的AES-256-GCM算法将身份验证和加密集成到单个流密码中。由于您应该在尝试解密数据之前始终对数据进行身份验证(大多数不遵守此规则的人都有问题),因此仅使用AES-256-CBC之类的工具是个坏主意


最后,请注意,您正在使用的蓝牙LE引入了AES-CCM,用于保密性、完整性和身份验证。希望您的通信基于此功能来实现您的目标。

“它只接受大小为20(字节)的数据包…”因此发送多个数据包。您在这里似乎也没有问题。@JamesKPolk请查看我添加的信息。我也强调了这个问题。因为我使用的是mesh系统,所以我无法流式传输数据或同时发送数据包。当向我的一个节点发送数据包时,该节点从接收到发送,从而终止连接。我需要大约4秒钟才能再次“看到”蓝牙节点。160位RSA提供的安全性太低,根本不需要麻烦。160位的椭圆曲线密码技术更强,尽管仍远低于当代标准。很遗憾,您的要求非常有限。@JamesKPolk谢谢您。我想我只是在寻求第二种意见,因为我对密码学知之甚少。请发布一个答案,以便我可以接受并给予您适当的信用。与其发布答案,不如建议您在crypto.stackexchange.com上提问。与其发布代码,不如简单地提及您的需求。他们有很多专家,其中一些可能在网状网络/资源受限加密方面有经验