按:以下文字涉及RSA对WebService传递的数据的加密解密,如果您已经熟知RSA或是有其它更好的方法请不要往下看以免浪费时间.
WebService采用的协议是SOAP,它基于HTTP,而HTTP是明文方式,也就是说,采用WebService传递的数据是明文的。如果是天气预报这种公开的只读信息的WebService无所谓,如果涉及写入或是和私密数据相关,那么明文传递就有很大的潜在危险性,必须加以遏止。
一般来说有两种方法,一是采用https加密的方式,另一种是用非对称加密算法对数据加密,下文提到的RSA就是第二种。
使用RSA对WebService传递的信息加密解密的基本思想是:服务器端提供一个WebService方法byte[] getServerPublicKey(),客户端可以以此得到服务器端的公钥,然后使用服务器端的公钥对要传出去的数据进行RSA加密,并附带以自己的公钥;服务器端得到客户端的请求后,先用自己的私钥解密客户端送来的数据,得到处理结果后用客户端提供的公钥加密,然后传回;客户端得到服务器端的返回数据后,用自己的私钥进行解密,最终得到了服务器端的真实数据。服务器端和客户端各自保存自己的RSA私钥用于解密,提供给对方RSA公钥进行加密,这样中间传递的信息就安全了。
加密解密示意顺序图:
下面是服务器端实现类的代码:
客户端调用服务器端的代码:
输出的结果为:
服务器端和客户端使用的RSA加密解密类代码:
用于初始化RSASecurityCoder实例的SecurityUtil类代码:
您可以从http://www.box.net/shared/cyg98xgz78 获得上述代码涉及到的两个实例工程。
好了,感谢您看到这里,希望此文字没有耽误您太多宝贵时间。
WebService采用的协议是SOAP,它基于HTTP,而HTTP是明文方式,也就是说,采用WebService传递的数据是明文的。如果是天气预报这种公开的只读信息的WebService无所谓,如果涉及写入或是和私密数据相关,那么明文传递就有很大的潜在危险性,必须加以遏止。
一般来说有两种方法,一是采用https加密的方式,另一种是用非对称加密算法对数据加密,下文提到的RSA就是第二种。
使用RSA对WebService传递的信息加密解密的基本思想是:服务器端提供一个WebService方法byte[] getServerPublicKey(),客户端可以以此得到服务器端的公钥,然后使用服务器端的公钥对要传出去的数据进行RSA加密,并附带以自己的公钥;服务器端得到客户端的请求后,先用自己的私钥解密客户端送来的数据,得到处理结果后用客户端提供的公钥加密,然后传回;客户端得到服务器端的返回数据后,用自己的私钥进行解密,最终得到了服务器端的真实数据。服务器端和客户端各自保存自己的RSA私钥用于解密,提供给对方RSA公钥进行加密,这样中间传递的信息就安全了。
加密解密示意顺序图:
下面是服务器端实现类的代码:
package com.heyang;
public class ServiceImpl implements IService{
@Override
public byte[] getResonse(byte[] params, byte[] clientPublicKey) {
try {
// 使用自己的私钥解密客户端用服务器端公钥加密的数据
String decryptString=SecurityUtil.getCoder().getDecryptString(params);
// 要返回的结果
String response="你好!"+decryptString;
// 使用客户端提供的公钥对返回的数据进行加密
byte[] retval=SecurityUtil.getCoder().getEncryptArray(response, clientPublicKey);
return retval;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public byte[] getServerPublicKey() {
return SecurityUtil.getCoder().getPublicKey();
}
}
public class ServiceImpl implements IService{
@Override
public byte[] getResonse(byte[] params, byte[] clientPublicKey) {
try {
// 使用自己的私钥解密客户端用服务器端公钥加密的数据
String decryptString=SecurityUtil.getCoder().getDecryptString(params);
// 要返回的结果
String response="你好!"+decryptString;
// 使用客户端提供的公钥对返回的数据进行加密
byte[] retval=SecurityUtil.getCoder().getEncryptArray(response, clientPublicKey);
return retval;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public byte[] getServerPublicKey() {
return SecurityUtil.getCoder().getPublicKey();
}
}
客户端调用服务器端的代码:
package com.heyang;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public class Test {
public static void main(String[] args) {
Service srvcModel = new ObjectServiceFactory().create(IService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
.newInstance().getXFire());
String helloWorldURL = "http://localhost:8080/XfireSample/services/hello";
try {
IService srvc = (IService) factory.create(srvcModel, helloWorldURL);
// 得到服务器端的公钥
byte[] serverPublicKey=srvc.getServerPublicKey();
System.out.print("从服务器端得到的公钥为:");
for(byte b:serverPublicKey){
System.out.print(b);
}
System.out.println();
RSASecurityCoder coder=SecurityUtil.getCoder();
String requestString="世界";
// 使用服务器端的公钥对要传出去的数据进行加密
byte[] params=coder.getEncryptArray(requestString, serverPublicKey);
// 得到服务器端的返回结果
byte[] responseArray=srvc.getResonse(params, coder.getPublicKey());
// 使用自己的私钥进行解密
String responseString=coder.getDecryptString(responseArray);
System.out.println("从服务器端返回的字符串结果是:"+responseString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public class Test {
public static void main(String[] args) {
Service srvcModel = new ObjectServiceFactory().create(IService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
.newInstance().getXFire());
String helloWorldURL = "http://localhost:8080/XfireSample/services/hello";
try {
IService srvc = (IService) factory.create(srvcModel, helloWorldURL);
// 得到服务器端的公钥
byte[] serverPublicKey=srvc.getServerPublicKey();
System.out.print("从服务器端得到的公钥为:");
for(byte b:serverPublicKey){
System.out.print(b);
}
System.out.println();
RSASecurityCoder coder=SecurityUtil.getCoder();
String requestString="世界";
// 使用服务器端的公钥对要传出去的数据进行加密
byte[] params=coder.getEncryptArray(requestString, serverPublicKey);
// 得到服务器端的返回结果
byte[] responseArray=srvc.getResonse(params, coder.getPublicKey());
// 使用自己的私钥进行解密
String responseString=coder.getDecryptString(responseArray);
System.out.println("从服务器端返回的字符串结果是:"+responseString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出的结果为:
从服务器端得到的公钥为:48-127-9748136942-12272-122-913111503-127-115048-127-1192-127-1270-575108-121578675121-687-32-1165359-2586-50-127114-24-6769-17-128115114982868-11550-121-111-69-494021-48-22-5844-37-8645-115-125-984651-344761-117-7875-34115-101-119164666123-4211-13-103-62-30-587926842-12338-32-91-24-75-1177128103-12-71108-121-122112-712-1089753-2691-7863-6385-41-10210782-8784120344-69-90474108-3661-47089-1261812510046-123-3910723101
从服务器端返回的字符串结果是:你好!世界
从服务器端返回的字符串结果是:你好!世界
服务器端和客户端使用的RSA加密解密类代码:
package com.heyang;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
* RSA加密解密类
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2010-12-1 下午06:14:38
* 修改时间:2010-12-1 下午06:14:38
*/
public class RSASecurityCoder{
// 非对称加密密钥算法
private static final String Algorithm="RSA";
// 密钥长度,用来初始化
private static final int Key_Size=1024;
// 公钥
private final byte[] publicKey;
// 私钥
private final byte[] privateKey;
/**
* 构造函数,在其中生成公钥和私钥
* @throws Exception
*/
public RSASecurityCoder() throws Exception{
// 得到密钥对生成器
KeyPairGenerator kpg=KeyPairGenerator.getInstance(Algorithm);
kpg.initialize(Key_Size);
// 得到密钥对
KeyPair kp=kpg.generateKeyPair();
// 得到公钥
RSAPublicKey keyPublic=(RSAPublicKey)kp.getPublic();
publicKey=keyPublic.getEncoded();
// 得到私钥
RSAPrivateKey keyPrivate=(RSAPrivateKey)kp.getPrivate();
privateKey=keyPrivate.getEncoded();
}
/**
* 用公钥对字符串进行加密
*
* 说明:
* @param originalString
* @param publicKeyArray
* @return
* @throws Exception
* 创建时间:2010-12-1 下午06:29:51
*/
public byte[] getEncryptArray(String originalString,byte[] publicKeyArray) throws Exception{
// 得到公钥
X509EncodedKeySpec keySpec=new X509EncodedKeySpec(publicKeyArray);
KeyFactory kf=KeyFactory.getInstance(Algorithm);
PublicKey keyPublic=kf.generatePublic(keySpec);
// 加密数据
Cipher cp=Cipher.getInstance(Algorithm);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return cp.doFinal(originalString.getBytes());
}
/**
* 使用私钥进行解密
*
* 说明:
* @param encryptedDataArray
* @return
* @throws Exception
* 创建时间:2010-12-1 下午06:35:28
*/
public String getDecryptString(byte[] encryptedDataArray) throws Exception{
// 得到私钥
PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(privateKey);
KeyFactory kf=KeyFactory.getInstance(Algorithm);
PrivateKey keyPrivate=kf.generatePrivate(keySpec);
// 解密数据
Cipher cp=Cipher.getInstance(Algorithm);
cp.init(Cipher.DECRYPT_MODE, keyPrivate);
byte[] arr=cp.doFinal(encryptedDataArray);
// 得到解密后的字符串
return new String(arr);
}
public byte[] getPublicKey() {
return publicKey;
}
public static void main(String[] arr) throws Exception{
String str="你好,世界! Hello,world!";
System.out.println("准备用公钥加密的字符串为:"+str);
// 用公钥加密
RSASecurityCoder rsaCoder=new RSASecurityCoder();
byte[] publicKey=rsaCoder.getPublicKey();
byte[] encryptArray=rsaCoder.getEncryptArray(str, publicKey);
System.out.print("用公钥加密后的结果为:");
for(byte b:encryptArray){
System.out.print(b);
}
System.out.println();
// 用私钥解密
String str1=rsaCoder.getDecryptString(encryptArray);
System.out.println("用私钥解密后的字符串为:"+str1);
}
}
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
* RSA加密解密类
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2010-12-1 下午06:14:38
* 修改时间:2010-12-1 下午06:14:38
*/
public class RSASecurityCoder{
// 非对称加密密钥算法
private static final String Algorithm="RSA";
// 密钥长度,用来初始化
private static final int Key_Size=1024;
// 公钥
private final byte[] publicKey;
// 私钥
private final byte[] privateKey;
/**
* 构造函数,在其中生成公钥和私钥
* @throws Exception
*/
public RSASecurityCoder() throws Exception{
// 得到密钥对生成器
KeyPairGenerator kpg=KeyPairGenerator.getInstance(Algorithm);
kpg.initialize(Key_Size);
// 得到密钥对
KeyPair kp=kpg.generateKeyPair();
// 得到公钥
RSAPublicKey keyPublic=(RSAPublicKey)kp.getPublic();
publicKey=keyPublic.getEncoded();
// 得到私钥
RSAPrivateKey keyPrivate=(RSAPrivateKey)kp.getPrivate();
privateKey=keyPrivate.getEncoded();
}
/**
* 用公钥对字符串进行加密
*
* 说明:
* @param originalString
* @param publicKeyArray
* @return
* @throws Exception
* 创建时间:2010-12-1 下午06:29:51
*/
public byte[] getEncryptArray(String originalString,byte[] publicKeyArray) throws Exception{
// 得到公钥
X509EncodedKeySpec keySpec=new X509EncodedKeySpec(publicKeyArray);
KeyFactory kf=KeyFactory.getInstance(Algorithm);
PublicKey keyPublic=kf.generatePublic(keySpec);
// 加密数据
Cipher cp=Cipher.getInstance(Algorithm);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return cp.doFinal(originalString.getBytes());
}
/**
* 使用私钥进行解密
*
* 说明:
* @param encryptedDataArray
* @return
* @throws Exception
* 创建时间:2010-12-1 下午06:35:28
*/
public String getDecryptString(byte[] encryptedDataArray) throws Exception{
// 得到私钥
PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(privateKey);
KeyFactory kf=KeyFactory.getInstance(Algorithm);
PrivateKey keyPrivate=kf.generatePrivate(keySpec);
// 解密数据
Cipher cp=Cipher.getInstance(Algorithm);
cp.init(Cipher.DECRYPT_MODE, keyPrivate);
byte[] arr=cp.doFinal(encryptedDataArray);
// 得到解密后的字符串
return new String(arr);
}
public byte[] getPublicKey() {
return publicKey;
}
public static void main(String[] arr) throws Exception{
String str="你好,世界! Hello,world!";
System.out.println("准备用公钥加密的字符串为:"+str);
// 用公钥加密
RSASecurityCoder rsaCoder=new RSASecurityCoder();
byte[] publicKey=rsaCoder.getPublicKey();
byte[] encryptArray=rsaCoder.getEncryptArray(str, publicKey);
System.out.print("用公钥加密后的结果为:");
for(byte b:encryptArray){
System.out.print(b);
}
System.out.println();
// 用私钥解密
String str1=rsaCoder.getDecryptString(encryptArray);
System.out.println("用私钥解密后的字符串为:"+str1);
}
}
用于初始化RSASecurityCoder实例的SecurityUtil类代码:
package com.heyang;
/**
* 信息安全实用类
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2010-12-2 上午10:57:49
* 修改时间:2010-12-2 上午10:57:49
*/
public class SecurityUtil{
// 用于加密解密的RSA编码类
private static RSASecurityCoder coder;
/**
* 初始化coder的静态构造子
*/
static{
try {
coder=new RSASecurityCoder();
} catch (Exception e) {
e.printStackTrace();
}
}
public static RSASecurityCoder getCoder() {
return coder;
}
}
/**
* 信息安全实用类
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2010-12-2 上午10:57:49
* 修改时间:2010-12-2 上午10:57:49
*/
public class SecurityUtil{
// 用于加密解密的RSA编码类
private static RSASecurityCoder coder;
/**
* 初始化coder的静态构造子
*/
static{
try {
coder=new RSASecurityCoder();
} catch (Exception e) {
e.printStackTrace();
}
}
public static RSASecurityCoder getCoder() {
return coder;
}
}
您可以从http://www.box.net/shared/cyg98xgz78 获得上述代码涉及到的两个实例工程。
好了,感谢您看到这里,希望此文字没有耽误您太多宝贵时间。
相关推荐
RSA算法基于大数分解难题的原理,使用公钥加密、私钥解密的方式实现信息的加密和解密。 知识点2:Java中RSA加密解密算法的实现 在Java中,可以使用Java Cryptography Architecture(JCA)来实现RSA加密解密算法。...
本教程主要讲解如何在C# .NET环境中使用RSA进行公钥加密和私钥解密,以及私钥加密和公钥解密的操作。 首先,让我们了解RSA的基本原理。RSA算法基于两个大素数的乘积,这个乘积作为公钥,而这两个大素数作为私钥。...
在Java中实现RSA加密解密,需要使用Java Cryptography Extension (JCE)库。以下是使用RSA加密解密的基本步骤: 1. **生成密钥对**:首先,我们需要生成一对公钥和私钥。在Java中,`java.security.KeyPairGenerator`...
这种加密方式使用了一对密钥,即公钥和私钥,使得信息的加密和解密过程可以独立进行。在RSA算法中,公钥用于加密数据,而私钥用于解密,这确保了即使公钥被公开,也只有持有私钥的人才能解密信息,从而提供了安全的...
本篇文章将深入探讨C#如何实现RSA加密解密,并结合Winform界面进行演示。 **1. RSA算法基础** RSA算法基于数论原理,包括大数因子分解的困难性。它包含两个密钥:公钥和私钥。公钥可以公开,用于加密;私钥必须...
私钥加密和公钥解密是RSA算法的核心特性,允许发送者使用接收者的公钥来加密数据,而只有持有对应私钥的接收者才能解密。在这个特定的案例中,`MyRSA.cs` 文件提供了一个实现,它使用了 `System.Numerics.BigInteger...
最后,涉及到ConsoleApplication1可能是一个C#的控制台应用程序示例,这个项目可能包含了实现RSA加密和解密的代码,用于演示如何在C#和Java之间进行安全的数据交换。通过阅读和理解这个示例代码,开发者可以更好地...
本例中的Project1.exe可能是一个Delphi编译的示例应用程序,展示了如何在Delphi环境中使用RSA加密和解密。这个程序应该演示了如何生成RSA密钥对,使用公钥加密数据,然后使用私钥解密,反之亦然。在实际应用中,公钥...
前后端API交互使用RSA和AES加密解密(js、Java).md
4. **文件解密**:只有拥有对应私钥的人才能对使用公钥加密的文件进行解密,这确保了只有预期的接收者才能访问到加密信息。 5. **操作流程**:"RSATool工具简易操作指南 .doc"文件应该详细阐述了如何导入密钥、选择...
以下是一段简单的Python代码示例,展示了如何使用`cryptography`库实现RSA加密和解密: ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives ...
RSA加密解密示例工程是一个专门针对Android平台设计的学习资源,旨在帮助开发者深入理解并实践RSA加密算法。RSA,全称Rivest-Shamir-Adleman,是一种非对称加密技术,广泛应用于网络安全、数据保护等领域。该示例...
- 加密的原始数据长度受到RSA密钥大小的限制,通常需要先对数据进行分块或使用对称加密(如AES)对大数据进行加密,然后用RSA加密对称密钥。 - 加密和解密过程中,保持一致的填充模式和编码方式,否则可能会导致解密...
本文将深入探讨RSA加密解密原理、在ARM架构上的实现以及相关程序示例。 首先,RSA的核心原理基于数论中的大数因子分解难题。两个大素数相乘很容易,但将其因子分解却极其困难。RSA算法就是利用这个特性来实现加密和...
使用rsa进行加密解密。前端使用js和公钥进行加密,后台使用java和私钥进行解密
由于项目需求,需要对一些重要信息进行RSA加密再传给服务器,网上找了挺久相关内容,终于解决,总结一下。 前端使用jsencrypt进行RSA加密解密(uniapp也可用) 一、引入jsencrypt.js文件 jsencrypt.js下载:...
RSA算法是一种非对称加密技术,它在信息安全领域扮演着重要的角色。非对称加密与对称加密的主要区别在于,它使用两个不同的密钥:一个公钥用于加密,另一个私钥用于解密。RSA的名字来源于它的发明者Ron Rivest、Adi ...
`jsencrypt.js`是一个JavaScript实现的RSA加密库,它允许在浏览器环境中进行RSA加解密操作。这个库非常方便,可以轻松集成到你的uni-app项目中,为前端数据加密提供支持。 在使用jsencrypt.js时,首先需要生成一对...
任何人都可以使用公钥对数据进行加密,但只有持有相应私钥的人才能解密,这使得它非常适合用于保护敏感信息。 在Python中,我们可以使用`PyCryptodome`库来实现RSA加密和解密。这个库提供了完整的密码学服务,包括...
接下来,我们将探讨如何使用RSA进行加密和解密。在C++中,OpenSSL提供了`RSA_public_encrypt`和`RSA_private_decrypt`函数来实现这些操作。 ```cpp int encrypted_len; unsigned char *encrypted = new unsigned ...