美文网首页
iOS与Java的RSA加密解密

iOS与Java的RSA加密解密

作者: qhqbcx | 来源:发表于2017-08-28 09:29 被阅读0次

    声明:亲测,是可以互通的。
    声明:本文摘抄来源http://www.jianshu.com/p/581380445eb4 作者totzcc
    iOS代码地址https://gist.github.com/lvjian700/204c23226fdffd6a505d

    1. 使用openssl生成密钥队,谷歌一下。注意:Java需要使用pkcs8 private key解密。
      2.pod 'Base64nl', '~> 1.2'
      3.iOS加密
      RSAEncryptor *rsa = [[RSAEncryptor alloc] init];
      NSLog(@"encryptor using rsa");
      NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"];
      NSLog(@"public key: %@", publicKeyPath);
      [rsa loadPublicKeyFromFile:publicKeyPath];
      NSString *securityText = @"hello ~";
      NSString *encryptedString = [rsa rsaEncryptString:securityText];
      NSLog(@"encrypted data: %@", encryptedString);
      4.Java解密
      基本步骤:
      加载pkcs8 private key:
      读取private key文件
      去掉private key头尾的"-----BEGIN PRIVATE KEY-----"和"-----BEGIN PRIVATE KEY-----"
      删除private key中的换行
      对处理后的数据进行Base64解码
      使用解码后的数据生成private key.
      解密数据:
      对数据进行Base64解码
      使用RSA decrypt数据.

    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.security.InvalidKeyException;
    import java.security.KeyFactory;
    import java.security.NoSuchAlgorithmException;
    import java.security.PrivateKey;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.util.Base64;
    import static java.lang.String.format;
    public class Encryptor {
    public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
    PrivateKey privateKey = readPrivateKey();
    String message = "AFppaFPTbmboMZD55cjCfrVaWUW7+hZkaq16Od+6fP0lwz/yC+Rshb/8cf5BpBlUao2EunchnzeKxzpiPqtCcCITKvk6HcFKZS0sN9wOhlQFYT+I4f/CZITwBVAJaldZ7mkyOiuvM+raXMwrS+7MLKgYXkd5cFPxEsTxpMSa5Nk=";
    System.out.println(format("- decrypt rsa encrypted base64 message: %s", message));
    // hello ~, encrypted and encoded with Base64:
    byte[] data = encryptedData(message);
    String text = decrypt(privateKey, data);
    System.out.println(text);
    }
    private static String decrypt(PrivateKey privateKey, byte[] data) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    byte[] decryptedData = cipher.doFinal(data);
    return new String(decryptedData);
    }
    private static byte[] encryptedData(String base64Text) {
    return Base64.getDecoder().decode(base64Text.getBytes(Charset.forName("UTF-8")));
    }
    private static PrivateKey readPrivateKey() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
    byte[] privateKeyData = Files.readAllBytes(
    Paths.get("/Users/twer/macspace/ios_workshop/Security/SecurityLogin/tools/pkcs8_private_key.pem"));
    byte[] decodedKeyData = Base64.getDecoder()
    .decode(new String(privateKeyData)
    .replaceAll("-----\w+ PRIVATE KEY-----", "")
    .replace("\n", "")
    .getBytes());
    return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decodedKeyData));
    }
    }

    相关文章

      网友评论

          本文标题:iOS与Java的RSA加密解密

          本文链接:https://www.haomeiwen.com/subject/htewdxtx.html