ssi

该文档简述三个框架的整合

session详解
http://blog.sina.com.cn/s/blog_69c7bf570100u3lx.html

<style type="text/css">
li.color {
color: red;
background: green;
}

li {
width: 80px;
height: 20px;
}
</style>
<script type="text/javascript">
$(function() {
$("#nav ul li").click(function() {
$(this).addClass("color").siblings().removeClass();
})
})
</script>
</head>

<body>
jquery 练习
<br>

<form action="">
<input id="username" type="text" name="name" value="ddd" />
</form>
</head>
<body>
<div id="nav">
<ul>
<li class="color">
<a href="javascript:void(0)">网页特效</a>
</li>
<li>
<a href="javascript:void(0)">珊珊影视在线</a>

</li>
<li>
<a href="javascript:void(0)">七彩影视</a>

</li>
<li>
<a href="javascript:void(0)">生活常识</a>

</li>
</ul>
</div>
</body>





解密在linux问题
通过图片可以看到,对相同的明文(cy11Xlbrmzyh:604:301:1353064296)进行加密,在linux上加密后的结果和在windows上是不同的;而且在linux上不能对加密之后的密文进行解密,并抛出异常。



原因:

经过检查之后,定位在生成KEY的方法上,即如下红色代码:



[java] view plaincopy
01./**
02.     * 获得秘密密钥
03.     * 
04.     * @param secretKey
05.     * @return
06.     * @throws NoSuchAlgorithmException 
07.     */ 
08.    private SecretKey generateKey(String secretKey) throws NoSuchAlgorithmException{ 
09.        <span style="color: rgb(255, 0, 0);">SecureRandom secureRandom = new SecureRandom(secretKey.getBytes()); //主要是此处代码 
10.</span>              
11.        // 为我们选择的DES算法生成一个KeyGenerator对象 
12.        KeyGenerator kg = null; 
13.        try { 
14.            kg = KeyGenerator.getInstance(DES_ALGORITHM); 
15.        } catch (NoSuchAlgorithmException e) { 
16.        } 
17.        kg.init(secureRandom); 
18.        //kg.init(56, secureRandom); 
19.         
20.        // 生成密钥 
21.        return kg.generateKey(); 
22.    } 

SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法,然后调用 setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。关于SecureRandom类的详细介绍,见 http://yangzb.iteye.com/blog/325264



解决办法

方法1:把原来的generateKey方法中红色如下的红色部分:



[java] view plaincopy
01./**
02. * 获得秘密密钥
03. * 
04. * @param secretKey
05. * @return
06. * @throws NoSuchAlgorithmException 
07. */ 
08.private SecretKey generateKey(String secretKey) throws NoSuchAlgorithmException{ 
09.    <span style="color: rgb(255, 0, 0);"><span><code class="comments">//防止linux下 随机生成key</code></span> 
10.    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); 
11.    secureRandom.setSeed(secretKey.getBytes()); 
12./span>       
13.    // 为我们选择的DES算法生成一个KeyGenerator对象 
14.    KeyGenerator kg = null; 
15.    try { 
16.        kg = KeyGenerator.getInstance(DES_ALGORITHM); 
17.    } catch (NoSuchAlgorithmException e) { 
18.    } 
19.    kg.init(secureRandom); 
20.    //kg.init(56, secureRandom); 
21.     
22.    // 生成密钥 
23.    return kg.generateKey(); 
24.} 


方法2:不使用SecureRandom生成SecretKey,而是使用SecretKeyFactory;重新实现方法generateKey,代码如下



[java] view plaincopy
01./**
02. * 获得密钥
03. * 
04. * @param secretKey
05. * @return
06. * @throws NoSuchAlgorithmException 
07. * @throws InvalidKeyException 
08. * @throws InvalidKeySpecException 
09. */ 
10.private SecretKey generateKey(String secretKey) throws NoSuchAlgorithmException,InvalidKeyException,InvalidKeySpecException{ 
11.     
12.    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM); 
13.    DESKeySpec keySpec = new DESKeySpec(secretKey.getBytes()); 
14.    keyFactory.generateSecret(keySpec); 
15.    return keyFactory.generateSecret(keySpec); 
16.} 


解决方案二:

javax.crypto.IllegalBlockSizeException: last block incomplete in decry

Admin
2013年3月12日 名人名言:懒惰它是一种对待劳动态度的特殊作风。它以难于卷入工作而易于离开工作为其特点——MRMY


Problem


比来要实现一个Android的AES加密解密的功能,然则却解密的时辰报异常。


javax.crypto.IllegalBlockSizeException: last block incomplete in decryption


org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:711) at javax.crypto.Cipher.doFinal(Cipher.java:100)


估计题目是传输的时辰因为编码造成数据丧失


Solution


将AES加密后的密文再进行整体的base64加密,解码时先对其进行base64解密再进AES解密,如许就能包管接管数据的正确性并且不会缺失。


然则应用android里面自带的Base64加密解密却报错。(不知道什么原因)


然后google了一把,本身写Base64加密的对象类。





package com.example.testandroid;

import java.io.ByteArrayOutputStream;

public class Base64Util {
    private static final char[] base64EncodeChars = new char[] { ""A"", ""B"", ""C"", ""D"", ""E"", ""F"", ""G"", ""H"", ""I"", ""J"", ""K"", ""L"", ""M"", ""N"", ""O"", ""P"", ""Q"", ""R"", ""S"", ""T"", ""U"", ""V"", ""W"", ""X"", ""Y"", ""Z"", ""a"", ""b"", ""c"", ""d"", ""e"", ""f"", ""g"", ""h"", ""i"", ""j"", ""k"", ""l"", ""m"", ""n"", ""o"", ""p"", ""q"", ""r"", ""s"", ""t"", ""u"", ""v"", ""w"", ""x"", ""y"", ""z"", ""0"", ""1"", ""2"", ""3"", ""4"", ""5"", ""6"", ""7"", ""8"", ""9"", ""+"", ""/"" };

   private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 };

   private Base64Util() {
    }

   /**
     * 将字节数组编码为字符串
     *
     * @param data
     */
    public static String encode(byte[] data) {
        StringBuffer sb = new StringBuffer();
        int len = data.length;
        int i = 0;
        int b1, b2, b3;

       while (i < len) {
            b1 = data[i++] & 0 xff;
            if (i == len) {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[(b1 & 0 x3) << 4]);
                sb.append("==");
                break;
            }
            b2 = data[i++] & 0 xff;
            if (i == len) {
                sb.append(base64EncodeChars[b1 >>> 2]);
                sb.append(base64EncodeChars[((b1 & 0 x03) << 4) | ((b2 & 0 xf0) >>> 4)]);
                sb.append(base64EncodeChars[(b2 & 0 x0f) << 2]);
                sb.append("=");
                break;
            }
            b3 = data[i++] & 0 xff;
            sb.append(base64EncodeChars[b1 >>> 2]);
            sb.append(base64EncodeChars[((b1 & 0 x03) << 4) | ((b2 & 0 xf0) >>> 4)]);
            sb.append(base64EncodeChars[((b2 & 0 x0f) << 2) | ((b3 & 0 xc0) >>> 6)]);
            sb.append(base64EncodeChars[b3 & 0 x3f]);
        }
        return sb.toString();
    }

   /**
     * 将base64字符串解码为字节数组
     *
     * @param str
     */
    public static byte[] decode(String str) {
        byte[] data = str.getBytes();
        int len = data.length;
        ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
        int i = 0;
        int b1, b2, b3, b4;

       while (i < len) {

           /* b1 */
            do {
                b1 = base64DecodeChars[data[i++]];
            } while (i < len && b1 == -1);
            if (b1 == -1) {
                break;
            }

           /* b2 */
            do {
                b2 = base64DecodeChars[data[i++]];
            } while (i < len && b2 == -1);
            if (b2 == -1) {
                break;
            }
            buf.write((int) ((b1 << 2) | ((b2 & 0 x30) >>> 4)));

           /* b3 */
            do {
                b3 = data[i++];
                if (b3 == 61) {
                    return buf.toByteArray();
                }
                b3 = base64DecodeChars[b3];
            } while (i < len && b3 == -1);
            if (b3 == -1) {
                break;
            }
            buf.write((int) (((b2 & 0 x0f) << 4) | ((b3 & 0 x3c) >>> 2)));

           /* b4 */
            do {
                b4 = data[i++];
                if (b4 == 61) {
                    return buf.toByteArray();
                }
                b4 = base64DecodeChars[b4];
            } while (i < len && b4 == -1);
            if (b4 == -1) {
                break;
            }
            buf.write((int) (((b3 & 0 x03) << 6) | b4));
        }
        return buf.toByteArray();
    }
}

猜你喜欢

转载自sammyfun.iteye.com/blog/1871867
ssi