Android 使用AES对文本消息进行端到端加密

Android 使用AES对文本消息进行端到端加密,android,encryption,aes,Android,Encryption,Aes,android中的端到端加密。我正在尝试在android中实现一个聊天应用程序 我曾尝试过AES算法进行加密和解密,成功生成了私钥和公钥 GeneratorSakeyPair.java类,用于生成公钥和私钥 try { // 1. generate public key and private key KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(&qu

android中的端到端加密。我正在尝试在android中实现一个聊天应用程序

我曾尝试过AES算法进行加密和解密,成功生成了私钥和公钥

GeneratorSakeyPair.java类,用于生成公钥和私钥

try {

        // 1. generate public key and private key
       

            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(1024); // key length
            KeyPair keyPair = keyPairGenerator.genKeyPair();
            String privateKeyString = Base64.encodeToString(keyPair.getPrivate().getEncoded(), Base64.DEFAULT);
            publicKeyString = Base64.encodeToString(keyPair.getPublic().getEncoded(), Base64.DEFAULT);

            // 2. print both keys
            System.out.println("rsa key pair generated\n");
            Log.e("privateKey",  privateKeyString );
            Log.e("publicKey",  publicKeyString );
            isgenerated=false;




    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
此代码对消息进行加密 试一试{

我希望我的私钥和公钥对于特定的用户应该是相同的,但是在我的代码中,当我构建我的应用程序时,它每次都生成不同的私钥和公钥,所以我如何管理当前用户以前的聊天消息和数据,以及每次一次聊天和群聊的私钥和公钥。
任何答案和建议都是可以接受的。

将您的私钥存储在
密钥库中,最好是一个系统密钥库,以提供额外的保护。对于Android,首先阅读有关Android密钥库系统的信息(因为这也可能影响密钥对的生成)。当然,也可以将PKCS#8编码的二进制私钥存储在永久性存储(“磁盘”)中,但不建议在不受保护的情况下存储密钥。存储在应用程序中的密码是可以提供的绝对最低安全性;通常,您会尝试更高的安全性

您的公钥可以简单地使用
getEncoded
进行编码。然后您可以将
KeyFactory
与算法
一起使用“RSA”
检索公钥。该公钥通常被编码为
X509SubjectPublicKeyInfo
对象。X.509当然是对X.509证书规范的提示:密钥被编码为兼容的二进制格式。公钥不需要太多保护,只要它们可以受信任;攻击者应该当然,他们不能用自己的公钥替换它们


如何信任公钥是有关密钥管理的整本书的主题。对于非对称密钥,您通常使用PKI(一种公钥基础设施)来分发和验证密钥的状态,并封装在公钥证书中。当使用X.509证书时,PKI通常被称为PKIX;在您的浏览器是非常大的PKIX系统的一部分。

将您的私钥存储在
密钥库中,最好是一个系统密钥库,以提供额外的保护。对于Android,首先阅读有关Android密钥库系统的信息(因为这也可能影响密钥对的生成)。当然,也可以将PKCS#8编码的二进制私钥存储在永久性存储(“磁盘”)中,但不建议在不受保护的情况下存储密钥。存储在应用程序中的密码是可以提供的绝对最低安全性;通常,您会尝试更高的安全性

您的公钥可以简单地使用
getEncoded
进行编码。然后您可以将
KeyFactory
与算法
一起使用“RSA”
检索公钥。该公钥通常被编码为
X509SubjectPublicKeyInfo
对象。X.509当然是对X.509证书规范的提示:密钥被编码为兼容的二进制格式。公钥不需要太多保护,只要它们可以受信任;攻击者应该当然,他们不能用自己的公钥替换它们


如何信任公钥是有关密钥管理的整本书的主题。对于非对称密钥,您通常使用PKI(一种公钥基础设施)来分发和验证密钥的状态,并封装在公钥证书中。当使用X.509证书时,PKI通常被称为PKIX;在您的浏览器是非常大的PKIX系统的一部分。

第一次您需要生成密钥并保存在db或共享首选项中。之后,您可以从存储中获取密钥并使用它,而不是每次创建。HI abdul用户可能有多个设备,因此当登录到其他分区时会发生什么情况。您可能需要组织您的code better.WRT要加密,请尝试使用经过身份验证的密码,如GCM,但请确保使用随机IV,而不是默认的/zero-ed密码。似乎根本没有理由对
secretKey
进行编码然后立即解码。这是密钥材料,请确保其安全。首次需要生成密钥并保存在db或shar中ed preference。在此之后,您可以从存储中获取密钥并使用它,而不是每次创建密钥。HI abdul用户可能有多个设备,因此当它登录到其他分区时会发生什么情况。您可能希望更好地组织代码。请注意加密,尝试使用经过身份验证的密码,如GCM,但请确保使用随机密码m IV,不是默认的/零编码的。似乎根本没有理由对
secretKey
进行编码然后立即解码。这是密钥材料,请确保安全。
               // 1. generate secret key using AES
               KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
               keyGenerator.init(128); // AES is currently available in three key sizes: 128, 192 and 256 bits.T
               // the design and strength of all key lengths of the AES algorithm are sufficient to protect classified information up to the SECRET level
               SecretKey secretKey = keyGenerator.generateKey();
               plainText=editTextsend.getText().toString();

               // 2. get string which needs to be encrypted // our case message
               String text = plainText;//"<your_string_which_needs_to_be_encrypted_here>"
               Log.e("string",text);

               // 3. encrypt string using secret key
               byte[] raw = secretKey.getEncoded();
               SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
               Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//PKCS5Padding
               cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));
               String cipherTextString = Base64.encodeToString(cipher.doFinal(text.getBytes(Charset.forName("UTF-8"))), Base64.DEFAULT);
               Log.e("ciphertext",cipherTextString);
               // 4. get public key
               X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(Base64.decode(publicKeyString, Base64.DEFAULT));
               KeyFactory keyFactory = KeyFactory.getInstance("RSA");
               PublicKey publicKey = keyFactory.generatePublic(publicSpec);

               // 6. encrypt secret key using public key
               Cipher cipher2 = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
               cipher2.init(Cipher.ENCRYPT_MODE, publicKey);
               String encryptedSecretKey = Base64.encodeToString(cipher2.doFinal(secretKey.getEncoded()), Base64.DEFAULT);
               Log.e("encryptedSecretKey",encryptedSecretKey);

               // 7. pass cipherTextString (encypted sensitive data) and encryptedSecretKey to your server via your preferred way.
               // Tips:
               // You may use JSON to combine both the strings under 1 object.
               // You may use a volley call to send this data to your server.

           } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidKeySpecException | InvalidAlgorithmParameterException e) {
               e.printStackTrace();
           }
        // 1. Get private key
        PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey, Base64.DEFAULT));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(privateSpec);
        Log.e("secretKey",privateKey+"");
        // 2. Decrypt encrypted secret key using private key
        Cipher cipher1 = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
        cipher1.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] secretKeyBytes = cipher1.doFinal(Base64.decode(encryptedSecretKeyString, Base64.DEFAULT));
        SecretKey secretKey = new SecretKeySpec(secretKeyBytes, 0, secretKeyBytes.length, "AES");
        Log.e("secretKey",secretKey+"");
        // 3. Decrypt encrypted text using secret key
        byte[] raw = secretKey.getEncoded();
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));
        byte[] original = cipher.doFinal(Base64.decode(encryptedTextString, Base64.DEFAULT));
        String text = new String(original, Charset.forName("UTF-8"));
        Log.e("text",text);
        // 4. Print the original text sent by client
        System.out.println("text\n" + text + "\n\n");


    } catch (NoSuchAlgorithmException | InvalidKeySpecException | InvalidKeyException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }