国密算法SM2加解密数据,解密出现异常

参考开源项目:https://github.com/ZZMarquis/gmhelper

旧标准的加密排序C!C2C3 新标准 C!C3C2
C1为65字节第1字节为压缩标识,这里固定为0x04,后面64字节为xy分量各32字节。C3为32字节。C2长度与原文一致。

如果密文转成byte数组 第一个元素不是0x04,那么需要进行数组copy

  public void testYouChu(){
//密文
        String miwei = "gcFp1B4g6FZ3WzDk40WN1E5Lk6VN6w6MPErq3DhKH5GDj1buZD/5l03kVdnKE3l1YsBx9wuvzsTPLuR3MAw++OSHx/ekERIKthJts3VXBzLCxAPVRDZbfVyOlUwM3wOrlbZmD5pvDeZlqc2UrCoYHw==";

        BASE64Decoder decoder = new BASE64Decoder();
        try {
            byte[] bytes = decoder.decodeBuffer(miwei);
            byte[] bytes1 = new byte[bytes.length+1];
            bytes1[0]=04;
            System.arraycopy(bytes, 0, bytes1, 1, bytes.length);
            System.out.println("SM2 decrypt result:\n" + ByteUtils.toHexString(bytes1));
//私钥            
String priHex = "5CBC68F46DA40C3FCA12EFF7C99F1306577B25BB86837FD99558DD1FD1AEC430";
            ECPrivateKeyParameters priKey = new ECPrivateKeyParameters(
                    new BigInteger(ByteUtils.fromHexString(priHex)), SM2Util.DOMAIN_PARAMS);
            byte[] decryptedData = SM2Util.decrypt(Mode.C1C3C2, priKey, bytes1);
            System.out.println("SM2 decrypt result:\n" + ByteUtils.toHexString(decryptedData));
        } catch (Exception ex) {
            ex.printStackTrace();
            Assert.fail();
        }

    }

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值