java - DES 解密/加密 java 到 python(帮助翻译)

标签 java python base64 translate des

我需要将 java 中的一段简短代码翻译为 python 3。

import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class DesEncrypterPdys {
    private static DesEncrypterPdys desEncrypter;
    private static Cipher ecipher;
    private static Cipher dcipher;

    private DesEncrypterPdys() throws DesEncrypterException{
        try {
            if(ecipher == null || dcipher == null){
                String cryptoKey;
                cryptoKey = "RAMPOLO S.O. Plokity Lopiokiujhygh ;)";

                SecretKey k = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(cryptoKey.getBytes()));

                ecipher = Cipher.getInstance("DES");
                dcipher = Cipher.getInstance("DES");
                ecipher.init(Cipher.ENCRYPT_MODE, k);
                dcipher.init(Cipher.DECRYPT_MODE, k);
            }
        }catch (Exception e) {
            throw new DesEncrypterException(e);
        }
    }

    public static DesEncrypterPdys getInstance() throws DesEncrypterException{
        if (desEncrypter == null || ecipher == null || dcipher == null) {
            desEncrypter = new DesEncrypterPdys();
        }
        return desEncrypter;
    }

    public String encrypt(String str) throws DesEncrypterException{
        try {
            if(str == null) return null;
            // Encode the string into bytes using utf-8
            byte[] utf8 = str.getBytes("UTF8");

            // Encrypt
            byte[] enc = ecipher.doFinal(utf8);

            // Encode bytes to base64 to get a string

            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
            throw new DesEncrypterException(e);
        } catch (IllegalBlockSizeException e) {
            throw new DesEncrypterException(e);
        }
        catch (java.io.IOException e) {
            throw new DesEncrypterException(e);
        }
    }

    public String decrypt(String str) throws DesEncrypterException{
        try {
            if(str == null) return null;
            // Decode base64 to get bytes
            byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

            // Decrypt
            byte[] utf8 = dcipher.doFinal(dec);

            // Decode using utf-8
            return new String(utf8, "UTF8");

        } catch (javax.crypto.BadPaddingException e) {
            throw new DesEncrypterException(e);
        } catch (IllegalBlockSizeException e) {
            throw new DesEncrypterException(e);
        } catch (java.io.IOException e) {
            throw new DesEncrypterException(e);
        }
    }

}

我尝试使用这样的东西:

import pyDes as pds
import base64 as b64


cryptoKey = "RAMPOLO S.O. Plokity Lopiokiujhygh ;)";
data = b" " # here should be a data for decrypting

k = pds.des(cryptoKey, pds.ECB, b"\0\0\0\0\0\0\0\0", pad=None, padmode=pds.PAD_PKCS5)
d = k.encrypt(data)
print("Encrypted: %r" % d)
print("Decrypted: %r" % k.decrypt(d))
print(b64.b64encode(d))

但不幸的是没有运气:/

我想要收到的是一个加密和解码密码的短程序。不幸的是我遇到了加密 key 太长的问题(?)。一旦我能够翻译一段类似的代码,但旧案例与 pydes 文档中的案例相对应可能是运气问题。现在不同了... 有人可以帮我把这个java代码翻译成python吗?

最佳答案

运行代码时返回的错误是:

>>> import pyDes as pds
>>> import base64 as b64
>>> cryptoKey = "RAMPOLO S.O. Plokity Lopiokiujhygh ;)"
>>> data = b"qwertyuiop" # Random gibberish
>>> k = pds.des(cryptoKey, pds.ECB, b"\0\0\0\0\0\0\0\0", pad=None, padmode=pds.PAD_PKCS5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pyDes.py", line 400, in __init__
    raise ValueError("Invalid DES key size. Key must be exactly 8 bytes long.")
ValueError: Invalid DES key size. Key must be exactly 8 bytes long.

如果你看一下 pyDES 的 Github 文档,它指定对于 DES 加密, key 应该是 8 字节长,你的要长得多。您需要使用较短的 key ,然后就可以正常工作了。

>>> k = pds.des('12345678', pds.ECB, b"\0\0\0\0\0\0\0\0", pad=None, padmode=pds.PAD_PKCS5)
>>> k
<pyDes.des object at 0x7fc4ade1f9d0>

重要的旁注,从安全角度来看,您应该避免使用 DES,因为它对于当今的标准来说已经完全被破坏,甚至维基百科 page(这不是密码学知识的重要来源)也表明 DES 破坏是可行的。此外,ECB 模式也被破坏,因为它不提供任何安全保证,因为每个 block 都以完全相同的方式加密,请检查 this

关于java - DES 解密/加密 java 到 python(帮助翻译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59215976/

相关文章:

java - Threads 和 Hibernate session 的随机错误

java - getResourceAsStream() 总是返回 null

java - 如何使用 Jcombo + 监听器

python - 使用正则表达式从字符串中删除单词

java - 尝试用 Java 从外部文件读取矩阵时陷入困境

python - 使用 Flask-classy 查看特定的上下文处理器

image - 如何使用c#从base64获取扩展名

c# - Base-64 字符数组或字符串的长度无效。 C# 中的 AES

scala - 已超过 Websocket 最大帧长度 65536

php - 通过php将数据请求发送到flask API