该文档简述三个框架的整合
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();
}
}
分享到:
相关推荐
标题中的"SSI-ABZ.rar_FPGA ABZ_FPGA SSI_SSI 转 ABZ信号FPAG程序_abz_ssi fpga" 提到了几个关键术语:SSI、ABZ、FPGA以及转换程序。这些术语涉及到电子工程领域,特别是数字系统设计中的一个重要部分——现场可编程...
SSI(Synchronous Serial Interface,同步串行接口)是一种在数字系统中常见的通信协议,用于传输数据。在本项目中,我们关注的是如何使用Verilog硬件描述语言来实现一个11位编码器的SSI读取功能。Verilog是一种广泛...
SSI(Server Side Include)是一种在Web服务器端处理页面动态包含的技术。它允许网页开发者在HTML文件中嵌入服务器端的脚本或指令,以便在页面加载时动态地插入数据、执行计算或者引用其他资源。SSI主要应用于静态...
SSI,全称是Shared State Infrastructure,它是一种分布式计算技术,主要应用于Web服务器环境中,用于在多个服务器之间共享和管理状态信息。在Web应用中,SSI常用来实现动态网页的生成,通过在静态HTML页面中嵌入可...
【标题】"SSI.rar_Cortex-M0 SSI_SSI_SSI驱动_TI cortex-M4" 提供的是关于在基于TI Cortex-M4处理器上的SSI(Synchronous Serial Interface)驱动程序,用于控制8位数码管显示。 【描述】"TI CORTEX M3 SSI驱动8...
"FPGA与SSI通信" FPGA(Field-Programmable Gate Array,场-programmable gate array)是一种可编程的数字集成电路,能够通过配置实现不同的逻辑功能。在嵌入式系统应用领域中,FPGA广泛应用于各种嵌入式系统的设计...
SSI,全称是Small-Scale Integration,是一种早期的集成电路(IC)集成度分类方式,它主要包含基础的逻辑门电路,如与非门、或非门、非门等。在现代数字系统设计中,SSI仍然作为理解数字逻辑设计的基础。Verilog是一...
在IT领域,特别是数据分析和机器学习中,"SSI"(可能是"Stability Selection"的缩写)是一个重要的概念,它与特征选择和模型稳定性密切相关。本压缩包文件"SSI.rar"包含了实现SSI算法的程序以及可能的数据处理工具,...
### SSI (Serial Synchronous Interface) 协议详解 #### 概述 SSI(Serial Synchronous Interface)协议是一种广泛应用于工业传感器与控制器之间的串行通信接口标准。它主要用于位置传感器,如绝对位置编码器的数据...
标题中的"SSI必须jar包"指的是在Web开发中使用Server Side Includes(SSI)技术所需的Java库文件。这些jar包是支持SSI框架运行的基础组件,它们提供了各种功能,使得开发者能够轻松地在服务器端动态地包含和处理网页...
SSI (Serial Slave Interface) 和 SPI (Serial Peripheral Interface) 是微控制器中常见的串行通信协议,广泛用于连接外部设备,如传感器、存储器和显示模块。TI DK-LM3S9B96 是德州仪器(Texas Instruments)推出的...
在标签“ssi”和“ssi_bus_总线”中,"ssi"是接口的缩写,而"ssi_bus_总线"强调了这是关于通信总线的一部分。在微控制器系统中,总线是连接不同组件并允许它们交换信息的通道。SSI总线允许微控制器与外部设备之间...
《LabVIEW FPGA入门:实现串行同步接口(SSI)》 LabVIEW FPGA是NI(National Instruments)提供的一个强大的工具,允许用户使用图形化编程环境来设计和实现FPGA(Field Programmable Gate Array)应用程序。本篇...
在这个"SSI整合项目 SSI系统绞手架 SSI框架整合"中,我们将探讨如何利用SSI来搭建一个高效、可扩展的系统框架。 首先,让我们了解一下SSI的基本用法。SSI指令通常以`<!--#`开头,`-->`结尾,例如`<!--#include ...
SSI208P模块将同步串行接口数据转换成并行接口数据,内部集成了SSI同步时钟发生器、脉冲计数器、数据串并转换、接口控制逻辑、输出控制以及收发驱动器(TTL-RS422电平转换)等功能单元,用户无须了解SSI数据格式,该...
用于将SSI协议转换成RS232协议,因为带SSI协议处理能力的单片机几乎没有
**SSI框架介绍** SSI,全称为Server Side Includes,是一种简单的服务器端脚本语言,主要用于在HTML文档中嵌入动态内容。这种技术最初被用于Web服务器上,以方便地实现页面部分更新,而无需整个页面刷新。尽管现代...
在标题"SSI_DataDriven2_SSI_模态自动识别_数据驱动随机子空间识别算法_随机子空间"中,关键词"SSI"指的是结构健康监测(Structural Health Monitoring),而"模态自动识别"和"数据驱动随机子空间识别算法"则明确...
西门子ET200S 1SSI绝对编码器模块是西门子公司推出的用于工业自动化领域的产品,主要用于将绝对位置编码器与分布式I/O系统相连。在详细介绍ET200S 1SSI绝对编码器模块的功能和使用方法之前,先对文档中提及的若干...
随着科技的发展,绝对值编码器的通信技术不断优化,SSI(Synchronous Serial Interface)协议作为一种高效、可靠的输出方式,得到了广泛应用。 SSI协议是一种同步串行通信协议,它解决了并行输出方式在高位数数据...