您当前的位置: 首页 >  Java

喜欢猪猪

暂无认证

  • 2浏览

    0关注

    228博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JAVA DESKeySpec 加密的实现

喜欢猪猪 发布时间:2021-12-14 11:39:53 ,浏览量:2

前言:

最近遇到了一个问题,那就是需要搬移一个net项目的DESKeySpec加密的方法,这个也是找了很多的博客,踩坑很多次才实现,现在记录一下,提供给需要的朋友;

具体的实现源码:

public static String DesEncrypt(String jobNum,String keys)
{
    try {
        byte[] key = keys.getBytes();
        // 初始化向量
        IvParameterSpec iv = new IvParameterSpec(key);
        DESKeySpec desKey = new DESKeySpec(key);
        // 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey securekey = keyFactory.generateSecret(desKey);
        // Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
        // 现在,获取数据并加密
        // 正式执行加密操作
        byte[] tt=jobNum.getBytes(StandardCharsets.UTF_8);
        byte[] tq= cipher.doFinal(tt);
        return parseByte2HexStr(tq);
    } catch (Throwable e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 将二进制转换成16进制
 *
 * @param buf
 * @return
 */
public static String parseByte2HexStr(byte buf[]) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < buf.length; i++) {
        String hex = Integer.toHexString(buf[i] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        sb.append(hex.toUpperCase());
    }
    return sb.toString();
}

public static byte[] convertHexString(String ss)
{
    byte digest[] = new byte[ss.length() / 2];
    for(int i = 0; i < digest.length; i++)
    {
        String byteString = ss.substring(2 * i, 2 * i + 2);
        int byteValue = Integer.parseInt(byteString, 16);
        digest[i] = (byte)byteValue;
    }

    return digest;
}

运行的效果:

 参考官方网站:DESKeySpec (Java Platform SE 6)

DES_KEY_LEN           定义以字节为单位的 DES 密钥长度的常量。

字段摘要static intDES_KEY_LEN           定义以字节为单位的 DES 密钥长度的常量。

 

构造方法摘要DESKeySpec(byte[] key)           创建一个 DESKeySpec 对象,使用 key 中的前 8 个字节作为 DES 密钥的密钥内容。DESKeySpec(byte[] key, int offset)           创建一个 DESKeySpec 对象,使用 key 中始于且包含 offset 的前 8 个字节作为 DES-EDE 密钥的密钥内容。

 

方法摘要 byte[]getKey()           返回 DES 密钥内容。static booleanisParityAdjusted(byte[] key, int offset)           确定给定的始于且包含 offset 的 DES 密钥内容是否是奇偶校验的 (parity-adjusted)。static booleanisWeak(byte[] key, int offset)           确定给定的 DES 密钥内容是否是全弱或者半弱的。

 

从类 java.lang.Object 继承的方法clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

 

字段详细信息

DES_KEY_LEN
public static final int DES_KEY_LEN

定义以字节为单位的 DES 密钥长度的常量。

另请参见:

常量字段值

构造方法详细信息

DESKeySpec
public DESKeySpec(byte[] key)
           throws InvalidKeyException

创建一个 DESKeySpec 对象,使用 key 中的前 8 个字节作为 DES 密钥的密钥内容。

组成 DES 密钥的字节在 key[0] 和 key[7] 范围内(包含两者)

参数:

key - 具有 DES 密钥内容的缓冲区。复制该缓冲区的前 8 个字节来防止后续修改。

抛出:

NullPointerException - 如果给定的密钥内容为 null

InvalidKeyException - 如果给定的密钥内容短于 8 个字节。

DESKeySpec
public DESKeySpec(byte[] key,
                  int offset)
           throws InvalidKeyException

创建一个 DESKeySpec 对象,使用 key 中始于且包含 offset 的前 8 个字节作为 DES-EDE 密钥的密钥内容。

组成 DES 密钥的字节在 key[offset] 和 key[offset+7] 范围内(包含两者)。

参数:

key - 具有 DES 密钥内容的缓冲区。复制该缓冲区始于且包含 offset 的前 8 个字节来防止后续修改。

offset - key 中的偏移量,DES 密钥内容从此处开始。

抛出:

NullPointerException - 如果给定的密钥内容为 null

InvalidKeyException - 如果给定的始于且包含 offset 的密钥内容短于 8 个字节。

方法详细信息

getKey
public byte[] getKey()

返回 DES 密钥内容。

返回:

返回 DES 密钥内容。每一次调用此方法都返回一个新数组。

isParityAdjusted
public static boolean isParityAdjusted(byte[] key,
                                       int offset)
                                throws InvalidKeyException

确定给定的始于且包含 offset 的 DES 密钥内容是否是奇偶校验的 (parity-adjusted)。

参数:

key - 具有 DES 密钥内容的缓冲区。

offset - key 中的偏移量,DES 密钥内容从此处开始。

返回:

如果给定的 DES 密钥内容是奇偶校验的,则返回 true,否则返回 false。

抛出:

InvalidKeyException - 如果给定的密钥内容为 null,或者始于且包含 offset 的密钥内容短于 8 个字节。

isWeak
public static boolean isWeak(byte[] key,
                             int offset)
                      throws InvalidKeyException

确定给定的 DES 密钥内容是否是全弱或者半弱的。

参数:

key - 具有 DES 密钥内容的缓冲区。

offset - key 中的偏移量,DES 密钥内容从此处开始。

返回:

如果给定的 DES 密钥内容是全弱或者半弱的,则返回 true,否则返回 false。

抛出:

InvalidKeyException - 如果给定的密钥内容为 null,或者始于且包含 offset 的密钥内容短于 8 个字节。

关注
打赏
1648795721
查看更多评论
立即登录/注册

微信扫码登录

0.0373s