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();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值