2014-04-12 73 views
0

在發送郵件中的URL之前,我能夠成功地加密/解密我的URL,但是在傳遞URL並檢索URL並解密URL的加密部分之後,它沒有被正確解密。解密後,我得到奇怪的字符,例如:使用DES的URL解密錯誤

dkjkb7i8doprgeh521tbbdll9r-Sat Apr 12 17:21:01 EEST 2014 

我的文字後:加密前

我的文字發送URL後

decryption:ziUO5baLOpFaOfWBtMOLhrRBR2ucXnxFHbA2KoRUVVQst6oDqUrGIU04qey4xU6haNvyp18+BROzadH6MXNxKA== 

網址解密,發送URL後解密的文字:

dkjkb7i8doprgeh521tbbdll9r-Sat Apr 12 17:21:01 **E[???xno** 

這是我的DES類,我用於加密,解密:

package com; 

import java.security.spec.KeySpec; 
import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 

public class DESEncryption { 

    private static final String UNICODE_FORMAT = "UTF8"; 
    public static final String DES_ENCRYPTION_SCHEME = "DES"; 
    private KeySpec myKeySpec; 
    private SecretKeyFactory mySecretKeyFactory; 
    private Cipher cipher; 
    byte[] keyAsBytes; 
    private String myEncryptionKey; 
    private String myEncryptionScheme; 
    SecretKey key; 

    public DESEncryption() throws Exception { 
     myEncryptionKey = "ThisIsSecretEncryptionKey"; 
     myEncryptionScheme = DES_ENCRYPTION_SCHEME; 
     keyAsBytes = myEncryptionKey.getBytes(UNICODE_FORMAT); 
     myKeySpec = new DESKeySpec(keyAsBytes); 
     mySecretKeyFactory = SecretKeyFactory.getInstance(myEncryptionScheme); 
     cipher = Cipher.getInstance(myEncryptionScheme); 
     key = mySecretKeyFactory.generateSecret(myKeySpec); 
    } 

    /** 
    * Method To Encrypt The String 
    */ 
    public String encrypt(String unencryptedString) { 
     String encryptedString = null; 
     try { 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
      byte[] plainText = unencryptedString.getBytes(UNICODE_FORMAT); 
      byte[] encryptedText = cipher.doFinal(plainText); 
      BASE64Encoder base64encoder = new BASE64Encoder(); 
      encryptedString = base64encoder.encode(encryptedText); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return encryptedString; 
    } 

    /** 
    * Method To Decrypt An Ecrypted String 
    */ 
    public String decrypt(String encryptedString) { 
     String decryptedText = null; 
     try { 
      cipher.init(Cipher.DECRYPT_MODE, key); 
      BASE64Decoder base64decoder = new BASE64Decoder(); 
      byte[] encryptedText = base64decoder.decodeBuffer(encryptedString); 
      byte[] plainText = cipher.doFinal(encryptedText); 
      decryptedText = bytes2String(plainText); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return decryptedText; 
    } 

    /** 
    * Returns String From An Array Of Bytes 
    */ 
    private static String bytes2String(byte[] bytes) { 
     StringBuffer stringBuffer = new StringBuffer(); 

     for (int i = 0; i < bytes.length; i++) { 
      stringBuffer.append((char) bytes[i]); 
     } 
     return stringBuffer.toString(); 
    } 

} 

回答

1

基地64利用/+字符。您需要執行以下任一操作:

  1. 對您的base 64字符串進行URL編碼;
  2. 使用對URL來說安全的base 64 variant

第一個是比較容易的代碼,也可以是比第二低效率的(如果有在編碼許多/+字符)。

請注意,您可以使用簡單的字符串替換來利用#2,所以它不是難。

+0

另請注意,這只是一個直接的答案。當我看問題中使用密碼學和Java時,我感到畏縮。也許可以將這個提供給codereview stackexchange網站。 –

+0

基地64字符串工作像一個魅力感謝男人:) – mkazma