RSA 算法加解密代码实现片段

采用java

秘钥生成

public void initKey() {
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
      keyPairGenerator.initialize(2048);//长度必须为64的倍数 512~65536 之间
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); //公钥
      RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();    //私钥
  }

公钥加密

public byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {
      KeyFactory keyFactory = KeyFactory.getInstance("RSA");
      X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
      PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
      Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
      cipher.init(Cipher.ENCRYPT_MODE, pubKey);
      return cipher.doFinal(data);
  }

公钥解密

public byte[] decryptByPublicKey(byte[] data) throws Exception {
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
       X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey.trim()));
       PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
       Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
       cipher.init(Cipher.DECRYPT_MODE, pubKey);
       int inputLen = data.length;
       int offSet = 0;
       byte[] cache;
       int i = 0;
       while (inputLen - offSet > 0) {
           if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
               cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
           } else {
               cache = cipher.doFinal(data, offSet, inputLen - offSet);
           }
           out.write(cache, 0, cache.length);
           i++;
           offSet = i * MAX_DECRYPT_BLOCK;
       }
       out.close();
       return out.toByteArray();
   }

私钥加密

public byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        int inputLen = data.length;
        int offSet = 0;
        byte[] cache;
        int i = 0;
        while (inputLen - offSet > 0) {
            if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
                cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
            } else {
                cache = cipher.doFinal(data, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            i++;
            offSet = i * MAX_ENCRYPT_BLOCK;
        }
        out.close();
        return out.toByteArray();
    }

私钥解密

public byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }