【信息安全_其他】JAVA(Android),PHP,IOS三平台RSA加解密互通算法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【信息安全_其他_】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

目录
相关文章
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
175 1
|
5月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
89 1
|
5月前
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
48 2
|
5月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
6月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
162 4
|
6月前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
79 3
|
6月前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
39 1
|
7月前
|
Java PHP 数据安全/隐私保护
php和Java配合 aes
php和Java配合 aes加密
53 1
|
6月前
|
Java 应用服务中间件 测试技术
PHP和Java在性能上的差异有哪些?
【7月更文挑战第2天】PHP和Java在性能上的差异有哪些?
283 0
|
6月前
|
Java 测试技术 数据库连接
PHP和Java哪个更难?
【7月更文挑战第2天】PHP和Java哪个更难?
83 0