多级加密解密算法的时间复杂度

时间:2014-05-20 22:09:30

标签: java algorithm encryption rsa time-complexity

在我的项目中,我通过多级算法提供了“加密和解密”。

我使用了RSA和3DES。现在我想计算其性能分析的时间复杂度。我在这里有点困惑。如何精确计算它或它的时间复杂度。

以下是Algo。

助手类

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;  
}  

MultilevelEnc Class

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
}

1 个答案:

答案 0 :(得分:1)

据我所知,目前所有标准加密算法的工作原理是在对每个块进行一些快速预处理之后,将一个块密码应用于不同的输入部分。每个分组密码在固定大小的输入上工作,因此具有运行时O(1)(尽管它可能是一个大的O(1)),因此每个加密和解密算法的运行时应该是O(n)(O (n)要处理的块,每块的O(1)时间)。您正在运行此密码的固定迭代次数,因此运行时也应该是O(n)。

要粗略估计挂钟运行时间,您可以使用System.nanoTime函数估算当前时间(以纳秒为单位),然后执行操作,再次调用System.nanoTime再次获得当前时间。然后差异为您提供总运行时间。

希望这有帮助!