社区
Java SE
帖子详情
求用java实现3DES加密,解密的完整代码【紧急】做过联通的sp的网关接入都知道。
WalkSing
2004-03-30 09:48:40
因时间紧迫,没时间研究。请熟悉的发给我。
qq:150939,msn:walksing@hotmail.com
注明:3des
...全文
177
10
打赏
收藏
求用java实现3DES加密,解密的完整代码【紧急】做过联通的sp的网关接入都知道。
因时间紧迫,没时间研究。请熟悉的发给我。 qq:150939,msn:walksing@hotmail.com 注明:3des
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
万分感谢!正在研究。等待测试通过后,给分。
c++实战区块链核心密码学-基于openssl
代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常, 易学不枯燥: 课程为了确保大部分人开发者都学得会,...
万字解析微服务
网关
鉴权:gateway使用、
网关
限流使用 用户密码
加密
JWT鉴权
客户端会多次请求不同的微服务,增加了客户端的复杂性存在跨域请求,在一定场景下处理相对复杂认证复杂,每个服务都需要独立认证难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个...
微服务
网关
鉴权:gateway使用、
网关
限流使用 用户密码
加密
JWT鉴权
客户端会多次请求不同的微服务,增加了客户端的复杂性存在跨域请求,在一定场景下处理相对复杂认证复杂,每个服务都需要独立认证难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个...
(二)
Java
网络编程之爆肝HTTP、HTTPS、TLS协议及对称与非对称
加密
原理!
最后再附上HTTP与HTTPS对比项HTTPHTTPS默认端口80443传输模式不安全的明文传输安全的
加密
传输使用成本免费且谁都能用需要花钱购买证书并核实身份连接状态无状态协议有状态协议握手过程TCP三次握手TCP三次握手+TLS四...
SQL数据库
加密
方式及实例
从2005开始提供了数据库层面的数据
加密
与
解密
。其
实现
方式主要有以下: 1、 利用CONVERT改变编码方式: 利用该函数把文字或数据转换成VARBINARY。但该方式不具备保护数据的能力,仅避免浏览数据的过程中能直接...
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章