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(); 
} } 

解决方案 »

  1.   

    以下内容为程序代码
    --------------------------------------------------------------------------------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(); 
    } } 
      

  2.   

    另外问一个问题
    有没有谁成功做过wap push 短信的? 
    我的环境win2k/jdk1.5 openwave_push1.5.jar . 我 可以成功 push ServiceIndication ,但是GSM手机收到,是无法显示改网页,如果不支持。
    并且不能push CustomContent text/plain 类型的。
      

  3.   

    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 接入管理平台返回认证结果时需要调用的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 未知的错误