如何判断一个字符串是否是SM4加密

如何判断一个字符串是否是SM4加密

1、在已知SM4密钥的情况下

假设已知SM4密钥为:c1bc47ef2097e4c177e2e3ace52b9601

public class SM4Utils {

    public static final String SM4K = "c1bc47ef2097e4c177e2e3ace52b9601";

    /**
     * 获取sm4秘钥
     *
     * @return sm4秘钥
     */
    public static String getSm4Key() {
        SM4 sm4 = SmUtil.sm4();
        SecretKey secretKey = sm4.getSecretKey();
        byte[] encoded = secretKey.getEncoded();
        return HexUtil.encodeHexStr(encoded);
    }

    /**
     * sm4加密
     *
     * @param content 文本
     * @return 加密后的结果
     */
    public static String encrypt(String content) {
        if (StringUtils.isBlank(content)) {
            return content;
        }
        //防止重复加密
        if(isSM4Encrypted(content)){
            return content;
        }
        SM4 sm4 = new SM4(HexUtil.decodeHex(SM4K));
        return sm4.encryptHex(content);
    }

    /**
     * @param content
     * @return 解密后的结果
     */
    public static String decrypt(String content) {
        if (StringUtils.isBlank(content)) {
            return content;
        }
        SM4 sm4 = new SM4(HexUtil.decodeHex(SM4K));
        return sm4.decryptStr(content);
    }

    /**
     * @Description : 判断是否是该密钥加密过的
     * @Param [encryptedString]
     * @return boolean
     **/
    public static boolean isSM4Encrypted(String encryptedString) {
        try {
            //尝试解密
            String decrypt = decrypt(encryptedString);
            // 如果解密成功,认为是使用该密钥加密的
            return decrypt!= null && decrypt.length() > 0;
        } catch (Exception e) {
            log.info("非本类密钥加密");
            // 解密失败,可能不是使用该密钥加密的
            return false;
        }
    }

    public static void main(String[] args) {
        // 原文本
        String content = "1521616984116514169156165156165516165156162165156";

        // 获取秘钥
        String sm4Key = getSm4Key();
        System.out.println("sm4秘钥:" + sm4Key);

        // 加密
        String encrypt = encrypt(null);
        System.out.println("加密后:" + encrypt);

        System.out.println("是否是SM4加密的密文:" + isSM4Encrypted(encrypt));

        // 解密
        String decrypt = decrypt(encrypt);
        System.out.println("解密后:" + decrypt);

    }


}

整体思路:使用该SM4密钥去解密,如果能解密出来内容,则代表已经被该密钥加密过一次,否则则未被该密钥加密过

2、在未知SM4密钥的情况下

这个时候就需要根据SM4加密过后的内容特征进行判断,比如为字母和数字的混合,不同长度对应的加密后字符串的长度也是不同的,只能粗略的判断一下,目前也没想到比较好的办法,各位大佬有什么好办法可以在评论区说一下~

你可能感兴趣的:(Java,记录,算法,java,开发语言)