在java中使用加密库在速度上不稳定第一轮比其他轮花费很多时间,一段时间后执行加密所需的时间是稳定的为什么这是以及如何从一开始就达到稳定,如果需要一些intail code我可以做到,但我知道需要调用 encrypt 方法来花费大量时间,请查看代码和包含结果的最后一行。
此类包含加密/解密的静态方法
package karp.generalutil.common;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class Encryptor {
/**
* @param args
*/
static Cipher eCipher,dCipher;
public Encryptor()
{
try {
eCipher=Cipher.getInstance("AES");
dCipher=Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/// for test
public static void main (String args[])
{
try {
KeyGenerator aes;
aes = KeyGenerator.getInstance("AES");
aes.init(128);
SecretKey key = aes.generateKey();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String encrypt(String clearText,String keyString) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException
{
SecretKey key=loadKey(keyString);
String encryptedText;
eCipher.init(Cipher.ENCRYPT_MODE,key );
encryptedText=new String(eCipher.doFinal(clearText.getBytes()));
return encryptedText;
}
public static String decrypt(String encryptedText,String keyString) throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException
{
SecretKey key=loadKey(keyString);
String clearText;
Cipher dCipher=Cipher.getInstance("AES");
dCipher.init(Cipher.DECRYPT_MODE,key);
clearText=new String(dCipher.doFinal(encryptedText.getBytes()));
return clearText;
}
public static byte[] encrypt(byte [] clearByteArray,String keyString)throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException
{
SecretKey key=loadKey(keyString);
byte[] encryptedByteArray;
Cipher eCipher=Cipher.getInstance("AES");
eCipher.init(Cipher.ENCRYPT_MODE,key );
encryptedByteArray=eCipher.doFinal(clearByteArray);
return encryptedByteArray;
}
public static byte[] decrypt(byte [] encryptedByteArray,String keyString)throws NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException
{
SecretKey key=loadKey(keyString);
byte[] clearByteArray;
Cipher dCipher=Cipher.getInstance("AES");
dCipher.init(Cipher.DECRYPT_MODE,key );
clearByteArray=dCipher.doFinal(encryptedByteArray);
return clearByteArray;
}
public static SecretKey loadKey(String keyString) {
byte[] encoded = keyString.getBytes();
SecretKey key = new SecretKeySpec(encoded, "AES");
return key;
}
}
这是测试类
import java.io.ByteArrayInputStream;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.util.Date;
public class tesst {
/**
* @param args
*/
public static void main(String[] args) {
try {
long y1,y2;
y1=System.nanoTime();
Encryptor e=new Encryptor();
String keyString="”{¶¹û¼«I?q-׫л•";
e.encrypt(new byte[31], "”{¶¹û¼«I?q-׫л•");
y2=System.nanoTime()-y1;
System.out.println("ini:"+y2);
for(int i=0;i<100000;i++)
{ byte [] x=new byte [31];
y1=System.nanoTime();
byte [] y=e.encrypt(x, "”{¶¹û¼«I?q-׫л•");
y2=System.nanoTime()-y1;
System.out.println(y2);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
第一个循环大约需要 193650106 ns 第二个循环大约需要 126150 ns 在 150 循环之后加密时间减少到 11546 ns