我被要求使用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;
}
}
您可以在我的全局变量中看到,以后我将不得不更改代码以在某个时候保存这些键,而不是每次重新创建它们,因此我总是使用相同的按键。此外,我需要将公共密钥文件提供给编写节点固件的工程师,以便他可以解码我的加密。由于我严格使用字节,因此我不应该有charset的问题。
您正在尝试重塑车轮:
-
您只能使用RSA签名和加密随机生成的键,您将在设备之间共享,而不是交换任何其他类型的数据。
-
然后,您应该使用这些键与对称算法在设备之间进行身份验证和加密数据。
如今,标准RSA密钥长度约为2048位。
如今,标准AES对称密钥长度约为256位。
但是键大小和块大小不是相同的:AES块大小为16字节。这应该舒适地适合您的小包装。
更准确地说,由于您的数据大小可能不完全是16个字节,因此您应该使用块密码算法(例如CBC)或stream Cipher One(例如GCM),以使用AES或AES处理数据其他对称算法。
最新的AES-256-GCM算法将单个流密封器中的身份验证和加密整合在一起。由于您应该在尝试解密数据之前始终对数据进行身份验证(大多数不遵守此规则的人都有问题),因此仅使用AES-256-CBC之类的东西是一个坏主意。
最后,请注意,您正在使用的蓝牙LE,引入AES-CCM,以保密,完整性和身份验证。愿您基于此功能以实现目标。