Des加密 (Ecb模式,PKCS5Padding的填充方式),Base64编码数据

http在数据通信的时候,因为不像https自带链路加密,所有为了安全性,使用http协议的时候,需要给请求包进行数据加密,为了配合服务器端的解密算法,我发送端使用了Des加密。(需要跟其他平台或者语言做交换的话,各个平台/语言间的加密模式需要一致,填充方式也需要一致。不得不说的一点是DES已经被破译过,当然这种破译的代价并不低,而且并不是那么简单。如果要求更高的数据安全级别,可以选择使用3DES或者AES等。)

一.Des加密

*请注意填充模式,我使用的填充模式是PKCS5Padding,填充的模式解释可看链接:https://www.cnblogs.com/slqt/p/6559828.html

//DES_ECB_eccrypt
int iTrd_Des_Ecb_Encrypt(unsigned char *pucKey, unsigned char *pucBuf, int iLen,unsigned char *pucOutPut)
{
    int i = 0;
    int iTemp   = 0;
    int iPadding = 0;
    int iOutLen;
    const_DES_cblock input;
    DES_cblock output;
    DES_cblock key;
    DES_key_schedule schedule;
	iOutLen = iLen;
    if(strlen(pucKey) != 8)
    {
        return 0;
    }
    memcpy(key,pucKey,8);
    DES_set_key_unchecked(&key, &schedule);//想用自己指定的密钥就只能调用key_unchecked

    if (iLen == 0)
        return 0;

    if(iOutLen%8 != 0)
    {
        iTemp = ( (iOutLen + 7) / 8 ) * 8;
        iPadding = iTemp - iOutLen;
        for (i = iOutLen; i < iTemp; i++)
        {
            //pucBuf[i] = iPadding + '0';
            pucBuf[i] = iPadding;
        }
        iOutLen = iTemp;
    }
    else
    {
        for (i = iOutLen; i < iOutLen+8; i++)
        {
            //pucBuf[i] = '8';
            pucBuf[i] = 8;
        }
        iOutLen += 8;
        
    }

    for(i =0; i < iOutLen; i = i + 8)
    {
        memcpy(input,(pucBuf + i),8);
        DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);//openssl提供的des_ecb加密函数
        memcpy(pucOutPut+i,output,8);
    }
    return iOutLen; 

}

注释的那两行,起初我补齐字节填充的时候填充的是字符,但是和在线加密工具的校验结果不一致,后来经过验证,直接填充数字即可,不需要转换成字符,需要注意一下这点;在线校验工具链接:http://tool.chacuo.net/cryptdes

二.base64编码

百度有很多源码,不过需要自己留心检查一下,会有一些小坑/小错误,需要自己调试的时候注意,例如字符串结束符'\0',别人可能写'/0',base64的编码表:大小写字母A-E 、a-e  ,阿拉伯数字0-9 ,以及特殊符号+ 和/ ,在编排这些的时候,源码里顺序可能给你打乱了。。。都是心机boy

//base64编码函数
long int Base64EnCode(_UC *src,long int src_len, _UC *dst)	 
{
	     
    long int i = 0, j = 0;
	     
	char base64_map[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	     
	for (; i < src_len - src_len % 3; i += 3) {
		 
		dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
		 
		dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
     
		dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) & 0x3)];
     
		dst[j++] = base64_map[src[i + 2] & 0x3F];
	}
	     
	if (src_len % 3 == 1) {
		 
		dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
		 
		dst[j++] = base64_map[(src[i] << 4) & 0x30];
		 
		dst[j++] = '=';
		 
		dst[j++] = '=';
		 
	}else if (src_len % 3 == 2) {
		 
		dst[j++] = base64_map[(src[i] >> 2) & 0x3F];
		 
		dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];
		 
		dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];
		 
		dst[j++] = '=';
		 
	}
	 
	dst[j] = '\0';
	printf("encode length:%ld/n",j);
	return j;
	     
} 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Java语言实现的代码示例: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class DesEncryptionExample { public static void main(String[] args) throws Exception { String plainText = "Hello, World!"; // 待加密的明文 String key = "MP1X46Zf"; // 密钥(加密:MP1X46Zf,解密:XcuAksWm) // 将密钥转换为字节数组 byte[] keyBytes = key.getBytes("UTF-8"); // 创建DES算法的密钥规则 SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES"); // 创建DES算法的加密器 Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec); // 将明文按照0x00填充到8的倍数 byte[] plainBytes = plainText.getBytes("UTF-8"); int paddingLength = 8 - (plainBytes.length % 8); byte[] paddedBytes = new byte[plainBytes.length + paddingLength]; System.arraycopy(plainBytes, 0, paddedBytes, 0, plainBytes.length); for (int i = plainBytes.length; i < paddedBytes.length; i++) { paddedBytes[i] = 0x00; } // 加密填充后的数据 byte[] encryptedBytes = cipher.doFinal(paddedBytes); // 将加密后的数据进行Base64编码 String base64Encoded = Base64.getEncoder().encodeToString(encryptedBytes); // 输出加密后的结果 System.out.println("加密后的结果:" + base64Encoded); } } ``` 注意:为了保证加密的数据长度是8的倍数,我们需要对原始数据进行填充。这里约定按照0x00进行填充。同时,由于Java默认使用PKCS5Padding填充方式,所以我们需要指定NoPadding填充方式。最后,我们还需要将加密后的数据进行Base64编码,以便在网络上传输。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值