DES 加密解密C#和JAVA 互通

关于DES使用可以查看:DES算法的详细使用

java版

public class DESUtils {
    /** 算法名称 */
    private static final String KEY_ALGORITHM = "DES";

    /** 算法名称/加密模式/填充方式 */
    private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";

    /** 8位KEY 默认 */
    private static final String DEFAULT_KEY = "12345678";
    /** 8位IV 默认 */
    private static final String DEFAULT_IV = "1qaz2wsx";

    /**
     * 生成密钥(base64字符串)
     */
    public static String initKey() throws NoSuchAlgorithmException, NoSuchProviderException {
        // 实例化密钥生成器
        KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
        String name = kg.getProvider().getName();
        System.out.println(name);
        // 生成密钥
        SecretKey secretKey = kg.generateKey();
        // 获取二进制密钥编码形式
        return Base64.encodeBase64String(secretKey.getEncoded());
    }

    /**
     * 转换密钥
     */
    private static Key toKey(String key) throws Exception {
        // 实例化Des密钥
        DESKeySpec dks = new DESKeySpec(Base64.decodeBase64(key));
        // 实例化密钥工厂
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
        // 生成密钥
        return keyFactory.generateSecret(dks);
    }

    /**
     * 加密数据
     *
     * @param data 待加密数据
     * @param key  密钥(8位字符的base64)
     * @param iv   加密向量(8位字符的base64)
     * @return 加密后的数据
     */
    public static String encrypt(String data, String key, String iv) throws Exception {
        // 还原密钥
        Key k = toKey(key);
        // 实例化Cipher对象,它用于完成实际的加密操作
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.decodeBase64(iv));
        // 初始化Cipher对象,设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, k, ivParameterSpec);
        // 执行加密操作。加密后的结果通常都会用Base64编码进行传输
        return Base64.encodeBase64String(cipher.doFinal(data.getBytes()));
    }

    public static String encrypt(String data, String key) throws Exception {
        String iv = Base64.encodeBase64String(DEFAULT_IV.getBytes(StandardCharsets.UTF_8));
        return encrypt(data, key, iv);
    }

    public static String encrypt(String data) throws Exception {
        String key = Base64.encodeBase64String(DEFAULT_KEY.getBytes(StandardCharsets.UTF_8));
        String iv = Base64.encodeBase64String(DEFAULT_IV.getBytes(StandardCharsets.UTF_8));
        return encrypt(data, key, iv);
    }

    /**
     * 解密数据
     *
     * @param data 待解密数据(base64字符串)
     * @param key  密钥(8位字符的base64)
     * @param iv   解密向量(8位字符的base64)
     * @return 解密后的数据
     */
    public static String decrypt(String data, String key, String iv) throws Exception {
        Key k = toKey(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.decodeBase64(iv));
        // 初始化Cipher对象,设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, k, ivParameterSpec);
        // 执行解密操作
        return new String(cipher.doFinal(Base64.decodeBase64(data)));
    }

    public static String decrypt(String data) throws Exception {
        String key = Base64.encodeBase64String(DEFAULT_KEY.getBytes(StandardCharsets.UTF_8));
        String iv = Base64.encodeBase64String(DEFAULT_IV.getBytes(StandardCharsets.UTF_8));
        return decrypt(data, key, iv);
    }

    public static String decrypt(String data, String key) throws Exception {
        String iv = Base64.encodeBase64String(DEFAULT_IV.getBytes(StandardCharsets.UTF_8));
        return decrypt(data, key, iv);
    }

    public static void main(String[] args) throws Exception {
        String source = "永无bug";
        System.out.println("原文: " + source);

        String key = initKey();
        System.out.println("密钥: " + key);

        String encryptData = encrypt(source, key, key);
        System.out.println("加密: " + encryptData);

        String decryptData = decrypt(encryptData, key, key);
        System.out.println("解密: " + decryptData);
    }
}

c#版

public class DESUtils
{
    private static string DEFAULT_KEY = "12345678";
    private static string DEFAULT_IV = "1qaz2wsx";
    public DESUtils(){}

    /// 加密
    public string Encode(string data, string key = null, string iv = null)
    {
        if (key == null)
            key = _key;
        if (iv == null)
            iv = _iv;

        byte[] byKey = ASCIIEncoding.ASCII.GetBytes(key);
        byte[] byIV = ASCIIEncoding.ASCII.GetBytes(iv);
        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
        int i = cryptoProvider.KeySize;
        MemoryStream ms = new MemoryStream();
        CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
        StreamWriter sw = new StreamWriter(cst);
        sw.Write(data);
        sw.Flush();
        cst.FlushFinalBlock();
        sw.Flush();
        return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
    }

    /// 解密
    public string Decode(string data, string key = null, string iv = null)
    {
        if (key == null)
            key = _key;
        if (iv == null)
            iv = _iv;

        byte[] byKey = ASCIIEncoding.ASCII.GetBytes(key);
        byte[] byIV = ASCIIEncoding.ASCII.GetBytes(iv);
        byte[] byEnc;

        byEnc = Convert.FromBase64String(data);
        DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
        MemoryStream ms = new MemoryStream(byEnc);
        CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
        StreamReader sr = new StreamReader(cst);
        return sr.ReadToEnd();
    }
}

转载于:https://my.oschina.net/who7708/blog/3033521

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DES(Data Encryption Standard)是一种对称加密算法,用于保护计算机和网络中的数据安全。DES算法使用相同的密钥进行加密和解密操作。 首先,我们来讨论DES的加密过程。在加密过程中,原始数据会被分成64位的数据块,并经过一系列复杂的置换、替代和混合等步骤,最终生成一个64位的密文数据块。加密过程中所使用的密钥也是64位的,通过子密钥的生成和迭代,将密钥与数据进行混合运算,从而实现加密操作。DES算法的强度在于它的迭代次数,通常会进行16轮迭代来确保数据的安全性。 接下来,我们来探讨DES的解密过程。在解密过程中,密文数据块会经过与加密过程相反的步骤,通过逆向置换、逆向替代和逆向混合等步骤,最终还原为原始的64位明文数据块。与加密过程类似,解密过程中使用的密钥也是相同的。通过迭代生成的子密钥,将密钥与密文数据块进行反向混合运算,实现解密操作。解密过程同样进行16轮迭代,以确保数据的正确性和完整性。 总之,DES算法是一种使用相同密钥进行加密和解密的对称加密算法。加密过程将原始数据分成64位数据块,并通过一系列复杂的步骤生成相应的密文数据块。解密过程则是将密文数据块经过相反的操作还原为原始的明文数据块。DES算法可以保护数据的机密性和安全性,广泛应用于计算机和网络领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值