求用java实现3DES加密,解密的完整代码【紧急】做过联通的sp的网关接入都知道。

WalkSing 2004-03-30 09:48:40
因时间紧迫,没时间研究。请熟悉的发给我。

qq:150939,msn:walksing@hotmail.com
注明:3des
...全文
177 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WalkSing 2004-03-31
  • 打赏
  • 举报
回复
test
WalkSing 2004-03-31
  • 打赏
  • 举报
回复
5.4 SSO接口
5.4.1 接口描述
SSO接口适用于Web方式。
UNI-WISE的Web门户主要用于用户自服务,包括用户注册、信息修改、服务定购、查帐等功能。
其他一些业务系统(例如IMAP、BREW)和SP也有自己的自服务页面,完成对该项具体业务的配置。
为了提供更好的用户体验,UNI-WISE和业务系统的Web门户之间应该实现SSO的协议。
SSO是Single Sign On的缩写,指的是用户只需要登录一次,就可以访问所有相关的站点的技术。
SSO一般用于Web应用,在WAP应用中不需要实现。
5.4.2 登录方式
用户可以通过以下四种方式登录:
1) 用户在联通Web门户上直接进行登录。
2) 用户尚未登录,直接访问Web门户上需要用户登录的页面。
3) 用户访问联通应用或SP的Web网站,点击"登录", 联通应用或SP的系统将页面重定向到联通Web门户网站的登录页面,进行登录;
4) 用户尚未登录,直接访问联通应用或SP的网站的服务,联通应用或SP重定向到联通Web门户网站的登录页面,进行登录。
SSO采用Cookie机制来实现。
5.4.3 接口流程

l 用户转向SP(或者业务系统)自服务页面。
2 用户转向SP(或者业务系统)查询Cookie,确认是否包含用户的Ticket。如果没有用户的Ticket,继续,否则,结束流程。
3. SP将用户的认证请求重定向到UNI-WISE登录页面。
4 UNI-WISE检查用户是否已经登录,如果没有登录,则提示用户登录。
5 用户登录后,向用户发送Ticket。
6. 将用户重定向回到SP(或者业务系统)自服务页面。
7 SP检查SPTokenResponseValue中是否包含正确的Ticket,如果正确,将其存入Cookie中。
(请注意,第7步和第2步是相互呼应的,第2步检查的是第7步保存的Cookie,因此,当用户再次访问该SP或者
业务系统时,就能够在不需要再次登录了)

对于SP(或者业务系统)来说,SSO流程的关键是第3步和第6步。
第3步,SP或者业务系统需要生成SPTicketRequest,将其重定向到UNI-WISE平台。
第6步,UNI-WISE平台生成SPTokenResponse,将其重定向到SP或者业务系统。SP或者业务系统对其进行检查。
5.4.4 SSO 接口消息格式
5.4.4.1 SPTicketRequest
重定向URL:
http://AuthenticationCenter/login?SenderID=UNICOM&Check=1&SPTicketRequest=SPTicketRequestValue
其中, AuthenticationCenter是接入管理平台的域名。
n 新增加字段:Check=1 判断用户是否登录,调用时URL如果包含此字段则直接返回用户是否登录。举例如下:
http://www.uni-wise.com/SSO/Login.aspx?SenderID=UNICOM&Check=1&SPTicketRequest=SPTicketRequestValue
返回URL如下:
http://ReturnURL?SendID=UNICOM&Login=0 表示用户没有登录
http://ReturnURL?SendID=UNICOM&Login=1 表示用户已经登录
n Check=0时或重定向URL中不包括此字段,则接口规范不变



SPTicketRequestValue为接口参数值,包含信息如下:
标识 名称 类型 最大字节数 备注
SPKey SPKey String 64 接入管理平台颁给SP的密钥
SPCode SPCode String 8 接入管理平台颁给SP的标识
TimeStamp TimeStamp String 18 该字段格式必须符合时间格式,采用格林威治时间,24小时表示,精确到毫秒:YYYYMMDDHHmmss.mil例如:20020801175035.207表示2002年8月1日17时50分35秒207毫秒
ReturnURL ReturnURL String 1024 接入管理平台返回认证结果时需要调用的URL

SPTicketRequestValue的生成算法如下:
Seed = ReturnURL +"$"+ TimeStamp
Digest = Base64(Hash(SPCode +"$"+ Seed + "$" + SPKey))
其中,Hash算法采用MD5。
SPTicketRequestValue = URLEncoding(SPCode +"$"+ Base64 (Encrypt (Seed + "$"+ Digest)))
= URLEncoding(SPCode +"$"+ Base64 (Encrypt (Seed + "$"+
Base64(Hash(SPCode +"$"+ Seed + "$" + SPKey)))))

URLEncoding是指对BASE64编码中的HTML控制码进行转义的过程,其具体实现参见RFC1738。
加密算法采用3-DES,Key=Hash (SPKey)(Hash算法采用MD5,出来的结果是16字节,后面补8个字节的0,一共24字节,作为3-DES的密钥)。
5.4.4.2 SPTicketResponse
l 返回认证结果URL:
http://ReturnURL?SenderID=UNICOM&SPTicketResponse=SPTicketResponseValue
其中, ReturnURL是从SPTicketRequest中得到。
SPTicketResponseValue为接口参数值,包含信息如下:
标识 名称 类型 最大字节数 备注
SPKey SPKey String 64 接入管理平台颁给SP的密钥
SPCode SPCode String 8 接入管理平台颁给SP的标识
TimeStamp TimeStamp String 18 该字段格式必须符合时间格式,采用格林威治时间,24小时表示,精确到毫秒:YYYYMMDDHHmmss.mil例如:20020801175035.207表示2002年8月1日17时50分35秒207毫秒
MDN MDN String 11 130/133开头的用户手机号
IMSI IMSI String 15 用户IMSI号)
UserID 用户唯一标识 String 10 当用户换卡换号时仍然可以标识出用户身份
UserName 用户名 String 32 用户名
EC EC String 10 错误代码(0表示成功)采用10进制表示
SPTicketResponseValue的生成算法如下:
Seed = MDN + 字符"$" + IMSI + 字符"$" + UserID + 字符"$" + URLEncoding(UserName) + 字符"$" + EC + 字符"$"+ TimeStamp
Digest = Base64(Hash(SPCode +"$"+ Seed + "$" + SPKey))
其中,Hash算法采用MD5。
SPTicketResponseValue = URLEncoding(SPCode +"$"+ Base64 (Encrypt (Seed + "$"+ Digest)))
= URLEncoding(SPCode +"$"+ Base64 (Encrypt (Seed + "$"+
Base64(Hash(SPCode +"$"+ Seed + "$" + SPKey)))))

URLEncoding是指对BASE64编码中的HTML控制码进行转义的过程,其具体实现参见RFC1738。
加密算法采用3-DES,Key=Hash (SPKey)(Hash算法采用MD5,出来的结果是16字节,后面补8个字节的0,一共24字节,作为3-DES的密钥)。
5.4.4.3 错误代码表
错误代码 EC字符串 说明
0x00000000 0000000000 成功
0x01030002 0016973826 找不到SPCode
0x01010003 0016842755 无效的返回URL
0x01020003 0016908291 无效的时间格式
0x0100000F 0016777231 未知的错误
zjq1980 2004-03-31
  • 打赏
  • 举报
回复
做过联通的sp的网关接入都知道

我怎么就不知道呢?
WalkSing 2004-03-31
  • 打赏
  • 举报
回复
up
阎罗 2004-03-30
  • 打赏
  • 举报
回复
以下内容为程序代码
--------------------------------------------------------------------------------

DESede(3DES)/DES对称算法
首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)

KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);


SecretKey deskey = keygen.generateKey();

用密钥加密明文(myinfo),生成密文(cipherByte)

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE,deskey);

byte[] cipherByte=c1.doFinal(myinfo.getBytes());

传送密文和密钥,本文没有相应代码可参考DSA

.............

用密钥解密密文

c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.DECRYPT_MODE,deskey);

byte[] clearByte=c1.doFinal(cipherByte);

相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术

对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下

SecretKey deskey = keygen.generateKey();
byte[] desEncode=deskey.getEncoded();
javax.crypto.spec.SecretKeySpec destmp=new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm);
SecretKey mydeskey=destmp;





相关API

KeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数

DES,DESede,Blowfish,HmacMD5,HmacSHA1

javax.crypto.Cipher 加/解密器

public static final Cipher getInstance(java.lang.String transformation)
throws java.security.NoSuchAlgorithmException,
NoSuchPaddingException





返回一个指定方法的Cipher对象

参数:transformation 方法名(可用 DES,DESede,Blowfish)

public final void init(int opmode, java.security.Key key)
throws java.security.InvalidKeyException


用指定的密钥和模式初始化Cipher对象

参数:opmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

key 密钥

public final byte[] doFinal(byte[] input)
throws java.lang.IllegalStateException,
IllegalBlockSizeException,
BadPaddingException





对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定


注意:本方法的执行前如果有update,是对updat和本次input全部处理,否则是本inout的内容

/*
安全程序 DESede/DES测试
*/
import java.security.*;
import javax.crypto.*;
public class testdes {
public static void main(String[] args){
testdes my=new testdes();
my.run();
}
public void run() {
//添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
String Algorithm="DES"; //定义 加密算法,可用 DES,DESede,Blowfish
String myinfo="要加密的信息";
try {
//生成密钥
KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
SecretKey deskey = keygen.generateKey();

//加密
System.out.println("加密前的二进串:"+byte2hex(myinfo.getBytes()));
System.out.println("加密前的信息:"+myinfo);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskey);
byte[] cipherByte=c1.doFinal(myinfo.getBytes());
System.out.println("加密后的二进串:"+byte2hex(cipherByte));
//解密
c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
byte[] clearByte=c1.doFinal(cipherByte);
System.out.println("解密后的二进串:"+byte2hex(clearByte));
System.out.println("解密后的信息:"+(new String(clearByte)));

}
catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();}
catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();}
catch (java.lang.Exception e3) {e3.printStackTrace();}
}
public String byte2hex(byte[] b) //二行制转字符串
{
String hs="";
String stmp="";
for (int n=0;n<b.length;n++)
{
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}

}
阎罗 2004-03-30
  • 打赏
  • 举报
回复
DESede/DES对称算法
首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)

KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);


SecretKey deskey = keygen.generateKey();

用密钥加密明文(myinfo),生成密文(cipherByte)

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE,deskey);

byte[] cipherByte=c1.doFinal(myinfo.getBytes());

传送密文和密钥,本文没有相应代码可参考DSA

.............

用密钥解密密文

c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.DECRYPT_MODE,deskey);

byte[] clearByte=c1.doFinal(cipherByte);

相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术

对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下

SecretKey deskey = keygen.generateKey();
byte[] desEncode=deskey.getEncoded();
javax.crypto.spec.SecretKeySpec destmp=new javax.crypto.spec.SecretKeySpec(desEncode,Algorithm);
SecretKey mydeskey=destmp;





相关API

KeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数

DES,DESede,Blowfish,HmacMD5,HmacSHA1

javax.crypto.Cipher 加/解密器

public static final Cipher getInstance(java.lang.String transformation)
throws java.security.NoSuchAlgorithmException,
NoSuchPaddingException





返回一个指定方法的Cipher对象

参数:transformation 方法名(可用 DES,DESede,Blowfish)

public final void init(int opmode, java.security.Key key)
throws java.security.InvalidKeyException


用指定的密钥和模式初始化Cipher对象

参数:opmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

key 密钥

public final byte[] doFinal(byte[] input)
throws java.lang.IllegalStateException,
IllegalBlockSizeException,
BadPaddingException





对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定


注意:本方法的执行前如果有update,是对updat和本次input全部处理,否则是本inout的内容

/*
安全程序 DESede/DES测试
*/
import java.security.*;
import javax.crypto.*;
public class testdes {
public static void main(String[] args){
testdes my=new testdes();
my.run();
}
public void run() {
//添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(new com.sun.crypto.provider.SunJCE());
String Algorithm="DES"; //定义 加密算法,可用 DES,DESede,Blowfish
String myinfo="要加密的信息";
try {
//生成密钥
KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
SecretKey deskey = keygen.generateKey();

//加密
System.out.println("加密前的二进串:"+byte2hex(myinfo.getBytes()));
System.out.println("加密前的信息:"+myinfo);
Cipher c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskey);
byte[] cipherByte=c1.doFinal(myinfo.getBytes());
System.out.println("加密后的二进串:"+byte2hex(cipherByte));
//解密
c1 = Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
byte[] clearByte=c1.doFinal(cipherByte);
System.out.println("解密后的二进串:"+byte2hex(clearByte));
System.out.println("解密后的信息:"+(new String(clearByte)));

}
catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();}
catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();}
catch (java.lang.Exception e3) {e3.printStackTrace();}
}
public String byte2hex(byte[] b) //二行制转字符串
{
String hs="";
String stmp="";
for (int n=0;n<b.length;n++)
{
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
if (n<b.length-1) hs=hs+":";
}
return hs.toUpperCase();
}

}
WalkSing 2004-03-30
  • 打赏
  • 举报
回复
up
yunuo2010000 2004-03-30
  • 打赏
  • 举报
回复
学习
WalkSing 2004-03-30
  • 打赏
  • 举报
回复
另外问一个问题
有没有谁成功做过wap push 短信的?
我的环境win2k/jdk1.5 openwave_push1.5.jar . 我 可以成功 push ServiceIndication ,但是GSM手机收到,是无法显示改网页,如果不支持。
并且不能push CustomContent text/plain 类型的。
WalkSing 2004-03-30
  • 打赏
  • 举报
回复
万分感谢!正在研究。等待测试通过后,给分。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧