【信息安全_其他】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

参考资料
https://github.com/x2on/OpenSSL-for-iPhone
http://blog.csdn.net/wangqiuyun/article/details/42143957/
http://php.net/manual/zh/ref.openssl.php

目录
相关文章
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
安全 数据挖掘 Android开发
Cellebrite UFED 4PC 7.72 (Windows) - Android 和 iOS 移动设备取证软件
Cellebrite UFED 4PC 7.72 (Windows) - Android 和 iOS 移动设备取证软件
1039 2
Cellebrite UFED 4PC 7.72 (Windows) - Android 和 iOS 移动设备取证软件
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
2448 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
安全 Android开发 数据安全/隐私保护
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
1309 12
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
782 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
893 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
800 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
Java PHP C++
搞笑:Java & PHP & C++ 之间的战斗!
image Java 拥有十八般武艺,PHP一招致命!PHP 果然是世界上最好的编程语言~ image image Java 连老将 C++ 也干不过,直接一招 KO,我也是醉了。
1429 0

热门文章

最新文章