如何通过消息和生成的Mac计算密钥

时间:2017-10-19 19:18:50

标签: java encryption java-8 cryptography

我想知道是否有办法通过消息获取密钥,并通过将密钥应用解密算法(SHA1)与密钥一起生成MAC,但密钥确实如此不知道,我该怎么办?我有一个随机计算MAC的例子,如下所示:

public class MACApp {
    public static void main(String[] args) {
        //if(args.length < 1) System.out.println("Úsese MACApp \"hola\"");
        //else performMACTest(args[0]);
        performMACTest("Hola");
    }

    public static void performMACTest(String s) {
        try {
            // Elegimos el algoritmo de hashing

            String alg = "HmacMD5";
            // Creamos un objeto Mac que implementa el algoritmo especificado
            Mac mac = Mac.getInstance(alg);
            // Construimos un genrador de claves privadas
            KeyGenerator generador = KeyGenerator.getInstance(alg);
            // Creamos una clave privada con el generador de claves

            SecretKey clavePrivada = generador.generateKey();
            mac.init(clavePrivada);
            // Pasamos la cadena de caracteres a un array de bytes y lo procesamos
            // con el algoritmo del Mac, es decir, procesamos (de manera indirecta) el
            // string que hemos pasado como parámetro
            mac.update(s.getBytes());
            // Indicamos que ya hemos acabado y recogemos el resultado
            byte[] b = mac.doFinal();
            System.out.println("\nMensaje original: " + s);
            System.out.println("\nMAC    :" + Conversor.aCadenaDeHexadecimales(b));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

class Conversor {
    public static String[] digitos =
            {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};

    public static String aCadenaDeHexadecimales(byte[] array) {
        String cadena = "";
        for (int i = 0; i < array.length; i++)
            cadena = cadena + convertirUno(array[i]);
        return cadena;
    }

    private static String convertirUno(byte valor) {
        int n = valor;
        if (n < 0) n = 256 + n;
        int d1 = n / 16;
        int d2 = n % 16;
        return digitos[d1] + digitos[d2];
    }
}

如果有人我可以帮忙找到钥匙。我举了一个例子:

  

消息:231456789 487654 500

     

MAC:5807a9647ed99e98b8d197e608c1de8bcffa571f

要加密/解密的哈希类型是SHA1,密钥的大小也是24位,即必须有3个字符。

1 个答案:

答案 0 :(得分:1)

获得关键就像为攻击者找到圣杯;如果你得到密钥,那么由该密钥加密或保护的所有内容基本上都会被破坏。因此,虽然密码和其他原语(如用于哈希函数的原语)存在许多问题,但通常无法获取密钥。

HMAC建立在安全的,单向哈希函数之上。由于函数是一种方法,因此不应该在没有强制执行的情况下检索键值。即使对于HMAC-MD5和HMAC-SHA1也是如此 - 即MAC功能建立在很大程度上破坏的哈希函数上。

你可以尝试直到世界末日,但你将无法找回钥匙 - 也不能解决这个问题的圣杯。