admin管理员组

文章数量:1794759

JAVA(Android),PHP,IOS三平台RSA加解密互通算法

JAVA(Android),PHP,IOS三平台RSA加解密互通算法

JAVA(Android),PHP,IOS三平台RSA加解密互通算法 RSA算法

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信摘要。对方收到信后,用不同的密钥解密并可核对信摘要。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

概述

RSA加解密主要实现公钥加密,私钥加密,公钥解密,私钥解密这四个方法。

RSA密钥分为公钥和私钥,其中比较特殊的是JAVA的私钥,PHP,IOS使用X509格式的密钥,JAVA的公钥使用X509格式,JAVA的私钥使用PKCS8格式的私钥(附件中private_key.pem)。

IOS和PHP加解密使用OpenSSL,JAVA使用Cipher类。

RSA加解密使用的密钥长度是1024,待加密的字节数不能超过密钥的长度值除以 8 再减去 11,目前实现的是只能处理117位数据。解密的密文最大长度为128。

三种语言都使用Base64编码进行编码。

IOS

IOS使用openssl,但是需要编译生成静态库libssl.a和libcrypto.a,openssl.framework导入工程进行加解密操作。

  • 公钥加密
  • NSData *d = [encrypt dataUsingEncoding:NSUTF8StringEncoding];

    int flen = [d length];

    unsigned char from[flen];

    bzero(from, sizeof(from));

    memcpy(from, [d bytes], [d length]);

    unsigned char to[128];

    bzero(to, sizeof(to));

    RSA *rsa_publickey = [self getPublicKeyByChar:key];

    int bytes = RSA_public_encrypt(flen, from, to, rsa_publickey, RSA_PKCS1_PADDING);

    NSData *result = [NSData dataWithBytes:to length:bytes];

    RSA_free(rsa_publickey);

  • 私钥解密
  • RSA *rsa_privatekey = [self getPrivateKeyByChar:key];

    NSData *data = [decrypt base64DecodedData];

    int flen = [data length];

    unsigned char from[flen];

    bzero(from, sizeof(from));

    memcpy(from, [data bytes], [data length]);

    unsigned char to[128];

    bzero(to, sizeof(to));

    int count = RSA_private_decrypt(flen, from, to, rsa_privatekey, RSA_PKCS1_PADDING);

    RSA_free(rsa_privatekey);

    然后将to转为NSString

  • 私钥加密
  • NSData *d = [encrypt dataUsingEncoding:NSUTF8StringEncoding];

    int flen = [d length];

    unsigned char from[flen];

    bzero(from, sizeof(from));

    memcpy(from, [d bytes], [d length]);

    unsigned char to[128];

    bzero(to, sizeof(to));

    RSA *rsa_privatekey = [self getPrivateKeyByChar:key];

    int bytes = RSA_private_encrypt(flen, from, to, rsa_privatekey, RSA_PKCS1_PADDING);

    NSData *result = [NSData dataWithBytes:to length:bytes];

    RSA_free(rsa_privatekey);

  • 公钥解密
  • RSA *rsa_privatekey = [self getPrivateKeyByChar:key];

    NSData *data = [decrypt base64DecodedData]; //base64

    int flen = [data length];

    unsigned char from[flen];

    bzero(from, sizeof(from));

    memcpy(from, [data bytes], [data length]);

    unsigned char to[128];

    bzero(to, sizeof(to));

    int count = RSA_private_decrypt(flen, from, to, rsa_privatekey, RSA_PKCS1_PADDING);

    RSA_free(rsa_privatekey);

    然后将to转为NSString

    JAVA

    使用Cipher;

  • 加载公钥
  • X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer); (RSAPublicKey) keyFactory.generatePublic(keySpec);

  • 加载私钥
  • PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);

    KeyFactory keyFactory = KeyFactory.getInstance(RSA);

    (RSAPrivateKey) keyFactory.generatePrivate(keySpec);

  • 私钥解密
  • Cipher cipher = Cipher.getInstance(RSA);

    cipher.init(Cipher.DECRYPT_MODE, privateKey);

    cipher.doFinal(encryptedData);

  • 公钥解密
  • Cipher cipher = Cipher.getInstance(RSA);

    cipher.init(Cipher.DECRYPT_MODE, publicKey);

    cipher.doFinal(encryptedData);

  • 私钥加密
  • Cipher cipher = Cipher.getInstance(RSA);

    cipher.init(Cipher.ENCRYPT_MODE, privateKey);

    cipher.doFinal(data);

  • 公钥加密
  • Cipher cipher = Cipher.getInstance(RSA);

    cipher.init(Cipher.ENCRYPT_MODE, publicKey);

    cipher.doFinal(data);

    PHP

    使用openssl。

    使用openssl_private_encrypt; openssl_public_encrypt; openssl_private_decrypt; openssl_public_decrypt 这些方法进行加解密操作,padding使用默认OPENSSL_PKCS1_PADDING

    参考资料
  • github/x2on/OpenSSL-for-iPhone
  • blog.csdn/wangqiuyun/article/details/42143957/
  • php/manual/zh/ref.openssl.php
  • 本文标签: 算法加解密平台androidjava