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



我被要求使用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,以保密,完整性和身份验证。愿您基于此功能以实现目标。

最新更新