Java 多级加解密算法的时间复杂度
在我的项目中,我通过多级算法提供了“加密和解密” 为此,我使用了RSA和3DES。现在我想计算它的时间复杂度,以便进行性能分析。我在这里有点困惑。如何准确地计算它或者它的时间复杂度是多少 下面是算法 助手类Java 多级加解密算法的时间复杂度,java,algorithm,encryption,rsa,time-complexity,Java,Algorithm,Encryption,Rsa,Time Complexity,在我的项目中,我通过多级算法提供了“加密和解密” 为此,我使用了RSA和3DES。现在我想计算它的时间复杂度,以便进行性能分析。我在这里有点困惑。如何准确地计算它或者它的时间复杂度是多少 下面是算法 助手类 class Helper{ public Cipher dcipher,ecipher; public Helper(String passPhrase){ byte[] salt = { (byte)0xA9, (byte)0x9B, (byte)0
class Helper{
public Cipher dcipher,ecipher;
public Helper(String passPhrase){
byte[] salt =
{ (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x34, (byte)0xE3, (byte)0x03
};
int iterationCount = 19;
try {
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount);
SecretKey key =
SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
iterationCount);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
}
catch(Exception e){ }
}
@SuppressWarnings("unused")
protected String encrypt(String str){
try{
byte[] utf8 = str.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
return new sun.misc.BASE64Encoder().encode(enc);
}
catch (Exception e) { }
return null;
}
// Decrpt password
//To decrypt the encryted password
protected String decrypt(String str) {
Cipher dcipher = null;
try{
byte[] salt = {(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,(byte)0x56,
(byte)0x34, (byte)0xE3, (byte)0x03};
int iterationCount = 19;
try{
String passPhrase="";
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount);
SecretKey key =
SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
dcipher = Cipher.getInstance(key.getAlgorithm());
// Prepare the parameters to the cipthers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
iterationCount);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
}
catch (Exception e) {
System.out.println("EXCEPTION: InvalidAlgorithmParameterException");
}
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
}
catch (BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
} catch (IOException e){
}
return null;
}
public String Encrypt()
{
try
{
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);//initialize key pairs to 512 bits ,you can also take 1024 or 2048 bits
kp=kpg.genKeyPair();
PublicKey publi=kp.getPublic();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publi);
byte[]src=srci.getBytes();//converting source data into byte array
cipherData = cipher.doFinal(src);//use this method to finally encrypt data
srco=new String(cipherData);//converting byte array into string
}
catch(Exception e)
{
}
return srco;
}
public String Decrypt(String cipherdata)
{
try
{
PrivateKey privatei=kp.getPrivate();//Generating private key
Cipher cipheri=Cipher.getInstance("RSA");//Intializing 2nd instance of Cipher class
cipheri.init(Cipher.DECRYPT_MODE, privatei);//Setting to decrypt_mode
byte[] cipherDat = cipheri.doFinal(cipherData);//Finally decrypting data
decryptdata=new String(cipherDat);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
return decryptdata;
}
public static void main(String args[])
{
String odata = "abcd";
String encdata2;
String decrypt2;
String decrypt1;
MultilevelEnc r = new MultilevelEnc(odata);
String encdata = r.Encrypt(); // RSA Algo Encryption
Helper h = new Helper("");
encdata2 = h.encrypt(encdata); // 3Des Algo Encryption
decrypt2 = h.decrypt(encdata2); // 3Des Decryption
decrypt1 = r.Decrypt(decrypt2); // RSA Decryption
}
多级课程
class Helper{
public Cipher dcipher,ecipher;
public Helper(String passPhrase){
byte[] salt =
{ (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x34, (byte)0xE3, (byte)0x03
};
int iterationCount = 19;
try {
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount);
SecretKey key =
SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
iterationCount);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
}
catch(Exception e){ }
}
@SuppressWarnings("unused")
protected String encrypt(String str){
try{
byte[] utf8 = str.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
return new sun.misc.BASE64Encoder().encode(enc);
}
catch (Exception e) { }
return null;
}
// Decrpt password
//To decrypt the encryted password
protected String decrypt(String str) {
Cipher dcipher = null;
try{
byte[] salt = {(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,(byte)0x56,
(byte)0x34, (byte)0xE3, (byte)0x03};
int iterationCount = 19;
try{
String passPhrase="";
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount);
SecretKey key =
SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
dcipher = Cipher.getInstance(key.getAlgorithm());
// Prepare the parameters to the cipthers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
iterationCount);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
}
catch (Exception e) {
System.out.println("EXCEPTION: InvalidAlgorithmParameterException");
}
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
}
catch (BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
} catch (IOException e){
}
return null;
}
public String Encrypt()
{
try
{
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);//initialize key pairs to 512 bits ,you can also take 1024 or 2048 bits
kp=kpg.genKeyPair();
PublicKey publi=kp.getPublic();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publi);
byte[]src=srci.getBytes();//converting source data into byte array
cipherData = cipher.doFinal(src);//use this method to finally encrypt data
srco=new String(cipherData);//converting byte array into string
}
catch(Exception e)
{
}
return srco;
}
public String Decrypt(String cipherdata)
{
try
{
PrivateKey privatei=kp.getPrivate();//Generating private key
Cipher cipheri=Cipher.getInstance("RSA");//Intializing 2nd instance of Cipher class
cipheri.init(Cipher.DECRYPT_MODE, privatei);//Setting to decrypt_mode
byte[] cipherDat = cipheri.doFinal(cipherData);//Finally decrypting data
decryptdata=new String(cipherDat);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
return decryptdata;
}
public static void main(String args[])
{
String odata = "abcd";
String encdata2;
String decrypt2;
String decrypt1;
MultilevelEnc r = new MultilevelEnc(odata);
String encdata = r.Encrypt(); // RSA Algo Encryption
Helper h = new Helper("");
encdata2 = h.encrypt(encdata); // 3Des Algo Encryption
decrypt2 = h.decrypt(encdata2); // 3Des Decryption
decrypt1 = r.Decrypt(decrypt2); // RSA Decryption
}
主类
class Helper{
public Cipher dcipher,ecipher;
public Helper(String passPhrase){
byte[] salt =
{ (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
(byte)0x56, (byte)0x34, (byte)0xE3, (byte)0x03
};
int iterationCount = 19;
try {
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount);
SecretKey key =
SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
iterationCount);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
}
catch(Exception e){ }
}
@SuppressWarnings("unused")
protected String encrypt(String str){
try{
byte[] utf8 = str.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
return new sun.misc.BASE64Encoder().encode(enc);
}
catch (Exception e) { }
return null;
}
// Decrpt password
//To decrypt the encryted password
protected String decrypt(String str) {
Cipher dcipher = null;
try{
byte[] salt = {(byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,(byte)0x56,
(byte)0x34, (byte)0xE3, (byte)0x03};
int iterationCount = 19;
try{
String passPhrase="";
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt,
iterationCount);
SecretKey key =
SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
dcipher = Cipher.getInstance(key.getAlgorithm());
// Prepare the parameters to the cipthers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
iterationCount);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
}
catch (Exception e) {
System.out.println("EXCEPTION: InvalidAlgorithmParameterException");
}
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
// Decrypt
byte[] utf8 = dcipher.doFinal(dec);
// Decode using utf-8
return new String(utf8, "UTF8");
}
catch (BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
} catch (IOException e){
}
return null;
}
public String Encrypt()
{
try
{
KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);//initialize key pairs to 512 bits ,you can also take 1024 or 2048 bits
kp=kpg.genKeyPair();
PublicKey publi=kp.getPublic();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publi);
byte[]src=srci.getBytes();//converting source data into byte array
cipherData = cipher.doFinal(src);//use this method to finally encrypt data
srco=new String(cipherData);//converting byte array into string
}
catch(Exception e)
{
}
return srco;
}
public String Decrypt(String cipherdata)
{
try
{
PrivateKey privatei=kp.getPrivate();//Generating private key
Cipher cipheri=Cipher.getInstance("RSA");//Intializing 2nd instance of Cipher class
cipheri.init(Cipher.DECRYPT_MODE, privatei);//Setting to decrypt_mode
byte[] cipherDat = cipheri.doFinal(cipherData);//Finally decrypting data
decryptdata=new String(cipherDat);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
return decryptdata;
}
public static void main(String args[])
{
String odata = "abcd";
String encdata2;
String decrypt2;
String decrypt1;
MultilevelEnc r = new MultilevelEnc(odata);
String encdata = r.Encrypt(); // RSA Algo Encryption
Helper h = new Helper("");
encdata2 = h.encrypt(encdata); // 3Des Algo Encryption
decrypt2 = h.decrypt(encdata2); // 3Des Decryption
decrypt1 = r.Decrypt(decrypt2); // RSA Decryption
}
据我所知,现在所有的标准加密算法都是在对每个块进行快速预处理后,对输入的不同部分逐个应用块密码。每个分组密码在固定大小的输入上工作,因此具有运行时O(1)(尽管它可能是一个较大的O(1)),因此每个加密和解密算法的运行时应为O(n)(要处理的O(n)个块,每个块的时间为O(1))。您正在运行此密码的固定迭代次数,因此运行时也应该是O(n) 要粗略估计挂钟运行时间,可以使用
System.nanoTime
函数以纳秒为单位估计当前时间,然后执行操作,然后再次调用System.nanoTime
再次获取当前时间。然后,差分会给出总运行时间
希望这有帮助 您需要提供更多的实现信息来解决问题。据我们所知,
multi-levelenc#Decrypt()
可以是从O(n!)
到O(n)
实现的任何地方……但是,您可以估计输入不同长度的输入的时间复杂度,并测量处理输入所需的时间。这里的“时间复杂度”是什么意思?你说的是大O符号还是挂钟时间,或者两者都有?两者都有。。。我必须在纸上把它们都展示出来@templatetypedefAlso,您显示的所有内容都是O(1),因为它不包含循环。任何复杂性度量都将基于您调用的操作。嘿,谢谢。。我明白你的意思。。