2014-04-12 52 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