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();
} }
首先生成密钥,并保存(这里并没的保存的代码,可参考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();
} }
解决方案 »
- 各位牛人,"|","&"">>""<<"运算符问题,帮忙讲下。
- 如何能定义变量只接受方法里的返回值?如例题:
- java堆的问题
- 关于JAVA开发桌面的一点小困扰
- StringBuffer???
- 高手近来看看啊,关于用servlet生成html页面的乱码问题!!!!
- 关于正则表达式的奇怪问题!!
- 使用对象的串行化机制,使用RandomAccessFile构造一个应用程序能够随机存取文件的记录,可显示、修改记录的内容
- 100分求JB8的注册码或注册文件
- 怎样用actionPerformed方法,创建jlabel,特急!问了好多人,都不会.
- 哪里有jdbc to db2驱动下载?
- 哪里有java/jdk的chm格式的帮助文件? 百分奉送
--------------------------------------------------------------------------------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();
} }
有没有谁成功做过wap push 短信的?
我的环境win2k/jdk1.5 openwave_push1.5.jar . 我 可以成功 push ServiceIndication ,但是GSM手机收到,是无法显示改网页,如果不支持。
并且不能push CustomContent text/plain 类型的。
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 接入管理平台返回认证结果时需要调用的URLSPTicketRequestValue的生成算法如下:
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 未知的错误