【问题标题】:URL decryption error using DES使用 DES 的 URL 解密错误
【发布时间】:2014-04-12 15:20:06
【问题描述】:

在通过电子邮件发送 URL 之前,我能够成功加密/解密我的 URL,但是在传递 URL 并检索它之后,我正在解密 URL 的加密部分,它没有被正确解密。解密后出现奇怪的字符,例如:

我加密前的文字:

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

我的文字之后:

decryption:ziUO5baLOpFaOfWBtMOLhrRBR2ucXnxFHbA2KoRUVVQst6oDqUrGIU04qey4xU6haNvyp18+BROzadH6MXNxKA==

发送url后解密url,发送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();
    }

}

【问题讨论】:

    标签: java security url encryption des


    【解决方案1】:

    Base 64 使用 /+ 字符。您需要执行以下任一操作:

    1. 对您的 base 64 字符串进行 URL 编码;
    2. 使用对 URL 安全的base 64 variant

    第一个更容易编码,但效率可能低于第二个(如果编码中有很多 /+ 字符)。

    请注意,您可以使用简单的字符串替换来利用 #2,所以它并不难

    【讨论】:

    • 另请注意,这只是一个直接的答案。当我看到问题中使用密码学和 Java 时,我感到畏缩。也许也可以将其提供给 codereview stackexchange 网站。
    猜你喜欢
    • 2011-10-14
    • 2011-12-13
    • 1970-01-01
    • 2018-10-14
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多