这段JAVA代码什么意思

import javax.crypto.*;
import java.security.*;

public class Encrypter
{
private static SecureRandom rand = null;

public static byte[] encrypt(String message, Key key) throws Exception
{
checkVersion();
Cipher c = Cipher.getInstance("RSA");
if(rand == null)
{
rand = SecureRandom.getInstance("SHA1PRNG");
Long seed = new Long(System.currentTimeMillis());
rand.setSeed(seed.toString().getBytes());
}
c.init(Cipher.ENCRYPT_MODE, key, rand);
return c.doFinal(message.getBytes("US-ASCII"));
}

public static void checkVersion(){
String version = System.getProperty("java.version");
char minor = version.charAt(2);
if(minor != '5')
throw new RuntimeException("JDK 1.5 is required to run this RSA" +
"application. \nJRE version "+ version + " found");
}

public static String decrypt(byte[] ct, Key key) throws Exception
{
checkVersion();
Cipher c = Cipher.getInstance("RSA");
c.init(Cipher.DECRYPT_MODE, key);
byte[] bytes = c.doFinal(ct);
return new String(bytes, "US-ASCII");
}

public static KeyPair generateKeys() throws Exception
{
checkVersion();
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
if(rand == null)
{
rand = SecureRandom.getInstance("SHA1PRNG");
Long seed = new Long(System.currentTimeMillis());
rand.setSeed(seed.toString().getBytes());
}
keygen.initialize(512, rand);
return keygen.genKeyPair();
}
}

javax.crypto.Cipher类提供加密和解密功能,该类是JCE框架的核心。

一,与所有的引擎类一样,可以通过调用Cipher类中的getInstance静态工厂方法得到Cipher对象。

public static Cipher getInstance(String transformation);

public static Cipher getInstance(String transformation,String provider);

参数transformation是一个字符串,它描述了由指定输入产生输出所进行的操作或操作集合。

参数transformation总是包含密码学算法名称,比如DES,也可以在后面包含模式和填充方式。

参数transformation可以是下列两种形式之一:

“algorithm/mode/padding”

“algorithm”

例如下面的例子就是有效的transformation形式:

"DES/CBC/PKCS5Padding"

"DES"

如 果没有指定模式或填充方式,就使用特定提供者指定的默认模式或默认填充方式。例如,SunJCE提供者使用ECB作为DES、DES-EDE和 Blowfish等Cipher的默认模式,并使用PKCS5Padding作为它们默认的填充方案。这意味着在SunJCE提供者中,下列形式的声明是 等价的:Cipher c1=Cipher.getInstance("DES/ECB/PKCS5Padding");

Cipher c1=Cipher.getInstance("DES");

当 以流加密方式请求以块划分的cipher时,可以在模式名后面跟上一次运算需要操作的bit数目,例如采用"DES/CFB8/NoPadding"和 "DES/OFB32/PKCS5Padding"形式的transformation参数。如果没有指定数目,则使用提供者指定的默认值(例如 SunJCE提供者使用的默认值是64bit)。

getInstance工厂方法返回的对象没有进行初始化,因此在使用前必须进行初始化。

通过getInstance得到的Cipher对象必须使用下列四个模式之一进行初始化,这四个模式在Cipher类中被定义为final integer常数,我们可以使用符号名来引用这些模式:

ENCRYPT_MODE,加密数据

DECRYPT_MODE,解密数据

WRAP_MODE,将一个Key封装成字节,可以用来进行安全传输

UNWRAP_MODE,将前述已封装的密钥解开成java.security.Key对象

每个Cipher初始化方法使用一个模式参数opmod,并用此模式初始化Cipher对象。此外还有其他参数,包括密钥key、包含密钥的证书certificate、算法参数params和随机源random。

我们可以调用以下的init方法之一来初始化Cipher对象:

public void init(int opmod,Key key);

public void init(int opmod,Certificate certificate);

public void init(int opmod,Key key,SecureRandom random);

public void init(int opmod,Certificate certificate,SecureRandom random);

public void init(int opmod,Key key,AlgorithmParameterSpec params);

public void init(int opmod,Key key,AlgorithmParameterSpec params,SecureRandom random);

public void init(int opmod,Key key,AlgorithmParameters params);

public void init(int opmod,Key key,AlgorithmParameters params,SecureRandom random);

必须指出的是,加密和解密必须使用相同的参数。当Cipher对象被初始化时,它将失去以前得到的所有状态。即,初始化Cipher对象与新建一个Cipher实例然后将它初始化是等价的。

二,可以调用以下的doFinal()方法之一完成单步的加密或解密数据:

public byte[] doFinal(byte[] input);

public byte[] doFinal(byte[] input,int inputOffset,int inputLen);

public int doFinal(byte[] input,int inputOffset,int inputLen,byte[] output);

public int doFinal(byte[] input,int inputOffset,int inputLen,byte[] output,int outputOffset);

在多步加密或解密数据时,首先需要一次或多次调用update方法,用以提供加密或解密的所有数据:

public byte[] update(byte[] input);

public byte[] update(byte[] input,int inputOffset,int inputLen);

public int update(byte[] input,int inputOffset,int inputLen,byte[] output);

public int update(byte[] input,int inputOffset,int inputLen,byte[] output,int outputOffset);

如果还有输入数据,多步操作可以使用前面提到的doFinal方法之一结束。如果没有数据,多步操作可以使用下面的doFinal方法之一结束:

public byte[] doFinal();

public int doFinal(byte[] output,int outputOffset);

如果在transformation参数部分指定了padding或unpadding方式,则所有的doFinal方法都要注意所用的padding或unpadding方式。

调用doFinal方法将会重置Cipher对象到使用init进行初始化时的状态,就是说,Cipher对象被重置,使得可以进行更多数据的加密或解密,至于这两种模式,可以在调用init时进行指定。

三,包裹wrap密钥必须先使用WRAP_MODE初始化Cipher对象,然后调用以下方法:

public final byte[] wrap(Key key);

如果将调用wrap方法的结果(wrap后的密钥字节)提供给解包裹unwrap的人使用,必须给接收者发送以下额外信息:

(1)密钥算法名称:

密钥算法名称可以调用Key接口提供的getAlgorithm方法得到:

public String getAlgorithm();

(2)被包裹密钥的类型(Cipher.SECRET_KEY,Cipher.PRIVATE_KEY,Cipher.PUBLIC_KEY)

sourcelink: http://bbs.sdu.edu.cn/pc/pccon.php?id=1292&nid=41716&order=&tid=

为了对调用wrap方法返回的字节进行解包,必须先使用UNWRAP_MODE模式初始化Cipher对象,然后调用以下方法 :

public final Key unwrap(byte[] wrappedKey,String wrappedKeyAlgorithm,int wrappedKeyType));

其 中,参数wrappedKey是调用wrap方法返回的字节,参数wrappedKeyAlgorithm是用来包裹密钥的算法,参数 wrappedKeyType是被包裹密钥的类型,该类型必须是Cipher.SECRET_KEY,Cipher.PRIVATE_KEY, Cipher.PUBLIC_KEY三者之一。

四,SunJCE提供者实现的cipher算法使用如下参数:

(1)采用CBC、CFB、OFB、PCBC模式的DES、DES-EDE和Blowfish算法。,它们使用初始化向量IV作为参数。可以使用javax.crypto.spec.IvParameterSpec类并使用给定的IV参数来初始化Cipher对象。

(2)PBEWithMD5AndDES使用的参数是一个由盐值和迭代次数组成的参数集合。可以使用javax.crypto.spec.PBEParameterSpec类并利用给定盐值和迭代次数来初始化Cipher对象。

注意:如果使用SealedObject类,就不必为解密运算参数的传递和保存担心。这个类在加密对象内容中附带了密封和加密的参数,可以使用相同的参数对其进行解封和解密。

Cipher 中的某些update和doFinal方法允许调用者指定加密或解密数据的输出缓存。此时,保证指定的缓存足够大以容纳加密或解密运算的结果是非常重要 的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-13
你才上初中就研究Java了,真厉害!呵呵!!
这段代码应该是一个Bean类中的一个方法,主要功能是按照你给的图片,建立一个名为kangzhw.jpg的图片,也就是说把你给的图片,复制成kangzhw.jpg,并且在复制后的文件中加了几个字(具体加什么,不清楚)。
------------------------------------
下面我们一行一行看:
Image
img
=
ImageIO.read(new
File(request.getRealPath("/")+"index\\"+fileName
));
说明:
//request.getRealPath("/"),取得当前站点的根目录.
//Image
img
=
ImageIO.read(),这里就是按照你给的文件名,读取文件到img对像中(文应该是个图片,不知道这里为什么没有做判断).
-----------------------------------------------------------
int
width
=
img.getWidth(null);
int
height
=
img.getHeight(null);
说明:
//这两句用于定义图片的宽和高。!!
------------------------------------------------------------
BufferedImage
image
=
new
BufferedImage(width,
height,
BufferedImage.TYPE_INT_RGB);
说明:
这里就是按照定义的图片宽和高,开一个缓冲区,用于日后存图片。
-------------------------------------------------------------
Graphics
g
=
image.createGraphics();
g.drawImage(img,
0,
0,
width,
height,
null);
说明:
这个是按照定义的宽和高还有上面那个img,搞一个画笔(就是Graphics),因为缓冲区都开了,总得有东西往里搞东西才行。image就是图片缓冲区。
--------------------------------------------------------------
String
stri
=
null;
//
if(addString.length()>14)
{
stri
=
addString.substring(1,14).concat("...");
}else
{
stri
=
addString;
}
//这一句,我也不知道啥意思,就是往图片里添加的字符串。
--------------------------------------------------------------
//设置要画的颜色为Green,GREEN是常量。
g.setColor(Color.GREEN);
//设置字体的大小样式。(有注释)
g.setFont(new
Font("Courier",
Font.PLAIN,
width/10));
//字体,样式,大小的设置
//字符串与字体所在的坐标。(有注释)
g.drawString(getStr(stri),
width
-
width*3/4,
height
-
height/2);
//把刚刚搞出来的画笔扔掉。销毁!
g.dispose();
说明:
以上所有操作是,先开一个图片的缓冲区(就是在内存里画出一个空的图片),然后在这个内存中的图片上添加一些字,这样就是准备出来一个模版,然后一会儿把你给的图片,再添加到这个图片上。
=====================
File
tempFile=
new
File(request.getRealPath("/")+"index\\"
,"kangzhw.jpg"
);
说明:这里新建立一个文件对象,文件名就是kangzhw.jpg,这里只是建立对象。
注:
从这里往后,我感觉代码有问题!
所以不解释!
FileOutputStream
os
=
new
FileOutputStream(request.getRealPath("/")+"index\\"+"kangzhw.jpg");
JPEGImageEncoder
encoder
=
JPEGCodec.createJPEGEncoder(os);
encoder.encode(image);
os.close();
第2个回答  2018-07-27
这是js代码,jquery.get代表使用ajax来访问地址,参考如下:
使用 AJAX 的 GET 请求来改变 div 元素的文本:
$("button").click(function(){
$.get("demo_ajax_load.txt", function(result){
$("div").html(result);
});
});

那个wordordersAction.do代表的是一个地址
第3个回答  2018-08-03
首先是往list集合中增加数据,然后,用迭代器循环输出list集合中的数据,代码不是很难,仔细看看分析下,很容易理解的
第4个回答  2016-08-29
#footersite { /* #为CSS选择器,标示按ID来选择,此处为定义id=footersite的元素的样式 */
clear:both; /* 保证两边没有float浮动的元素,可以保证元素在float浮动元素的下方,而不是在旁边 */
display:block; /* 以块形式渲染,可指定高度,宽度 */
overflow:hidden; /* 对于超出指定宽度高度的内容,采用隐藏效果 */
text-align:center; /* 定义文字的对齐方式,中间对齐 */
margin:0px 10px; /* 相对于父元素的留白,上下0,左右10 */
padding-bottom:0; /* 元素内部的留白 */
z-index:11; /* 指定元素的层叠次序为11 */
border-top:1px #E0E0E0 solid; /* 指定顶部边框样式,1像素宽,颜色,实线 */
color:#888 /* 文本颜色 */
}

#footersite h5, #footersite h6{ /* 指定id=footersite的元素内部 h5 h6元素的样式 */
display:block; margin:0; padding:0;
line-height:normal; /* 指定文本的行高 */
font-size:12px; /* 指定文字的字号 */
font-family:Arial,Helvetica,sans-serif; /* 指定文字的字体名称 */
font-weight:normal; /* 指定文字是否加粗,不加粗 */
background:transparent /* 指定背景为透明 */
}

#footersite a, #footersite a:hover{ /* 指定id=footersite的元素内部 a元素的样式以及当鼠标悬停在a元素上的样式 */
text-decoration:none; /* 文本下划线,不使用下划线 */
color:#444;
cursor:pointer; /* 鼠标指针样式,链接小手 */
padding-left:2px; padding-right:2px
}

#footersite a:hover{color:#F60}/* 指定id=footersite的元素内部 鼠标悬停在a元素上的样式,改变颜色 */

.footer{ /* 定义CSS伪类,可以被任何HTML元素使用,通过指定class=footer,即可使用该样式 */
display:block; overflow:hidden; width:970px; margin:0 auto; padding-bottom:3px; padding-top:3px
}
/* 指定class=footer元素内部 span元素的样式 */
.footer span{border-left:1px solid #E0E0E0; padding-left:5px}本回答被网友采纳
相似回答