DES CBC加密实例

以下是我基于STM32+PolarSSL加密库调通的基于DES CBC加密形式的例子。好让自己能用来做比对。

1. 使用DES-CBC加密方式,并使用PKCS5Padding方式填充

2. 明文为(字符串): <xml>123232</xml>

3.生成的密文(十六进制数据): 305F62576A76B23D6822B53FC537014058360A0D1696610B

4.密钥为(字符串):rw4fef48

5.初始向量iv为:0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

PKCS5Padding的解释如下:

在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间(块长度超出255的尚待研究),填充值的算法都是一样的:
value=k - (l mod k)  ,K=块大小,l=数据长度,如果l=8, 则需要填充额外的8个byte的8
对方的算法是:
//补齐数据
pading = 8 - (_raw_size % 8);
*_dst_size = _raw_size + pading;
for (i = _raw_size; i < *_dst_size; i++) 
{
_raw_ptr[i] = pading;

}

基于PolarSSL的基本测试程序如下:

unsigned char DESKey1[9] = {"rw4fef48"};
unsigned char Pt[] = {'<','x','m','l','>','1','2','3','2','3','2','<','/','x','m','l','>'};
unsigned char Cryt[64] = {0};
unsigned char iv[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
des_context ctx;
    
for(unsigned char i = 0; i < sizeof(Pt); i++)
{
    Cryt[i] = Pt[i];
}
unsigned char Index = sizeof(Pt);
unsigned char pading;
pading = 8 - (Index % 8);
for (unsigned char i = 0; i < pading; i++) 
{
    Cryt[Index+i] = pading;
}
des_setkey_enc( &ctx, (unsigned char *)DESKey1);
des_crypt_cbc( &ctx, DES_ENCRYPT, Index+pading, iv, Cryt, Cryt );
    
printf("\r\n");
for(unsigned short i = 0; i < Index+pading; i++)
{
    printf("%02X ", Cryt[i]);
}
printf("\r\n");
    
memset(iv, 0, sizeof(iv));
des_setkey_dec( &ctx, (unsigned char *)DESKey1);
des_crypt_cbc(&ctx, DES_DECRYPT, Index+pading, iv, Cryt, Cryt);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出Java中提供了3DES加解密的工具类,同时支持ECB和CBC两种加密模式。如果需要使用3DESCBC解密工具类,可以按照以下步骤进行操作: 1. 导入相关的Java类库。 2. 创建3DESCBC解密工具类的实例。 3. 调用解密方法,传入密文和密钥等参数。 4. 获取解密后的明文数据。 下面是一个简单的示例代码: ``` import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Java3DESCBCDecryptUtil { private static final String ALGORITHM = "DESede"; private static final String TRANSFORMATION = "DESede/CBC/PKCS5Padding"; private static final String CHARSET = "UTF-8"; public static String decrypt(String key, String iv, String encryptedData) throws Exception { byte[] keyBytes = key.getBytes(CHARSET); byte[] ivBytes = iv.getBytes(CHARSET); byte[] encryptedBytes = Base64.decodeBase64(encryptedData.getBytes(CHARSET)); SecretKey secretKey = new SecretKeySpec(keyBytes, ALGORITHM); IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec); byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, CHARSET); } } ``` 在上面的代码中,我们使用了Java中的Cipher类来进行解密操作。同时,我们还需要提供密钥和初始化向量等参数。在实际使用中,我们可以根据具体的需求来修改代码中的参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值