Diffie-Hellman裂缝已知部分信息

问题描述 投票:-1回答:1

这是学校的工作。

我遇到了在DH交换中找到双方私钥的问题。测试中涉及的数字不够大,任务基本上是暴力。在任务中,我可以获得素数p,生成器g和Alice的公钥A。我还给出了加密消息和使用自定义密钥解密消息的方法。

现在我只通过循环整数a并检查i=1...p并及时返回符合要求的第一个值来获得g^i mod p == g^A mod p

但是,根据自动化测试,我的解决方案并非总是如此。任何人都知道如何,甚至可以用给定的信息fins ab

java algorithm diffie-hellman
1个回答
0
投票

感谢第三方,我成功破解了DH代码:

public Integer crackAlice() {
        // TODO
        Integer alicePrivate = 0;

        int p = session.getP();
        int g = session.getG();
        int A = session.getAlicesPublicKey();
        // A = g^a mod p


        System.out.println("Alice public A: "+A);
        String message = String.valueOf(156215);

        for (int i = 1; i < p; i++) {
            if (BigInteger.valueOf(g).pow(i).mod(BigInteger.valueOf(p)).equals(BigInteger.valueOf(A))) {
                //System.out.println("\t\t\t\t"+BigInteger.valueOf(g).pow(i));
                alicePrivate = i;
                System.out.println("Potential Alice private a: "+i);
                //break;
            }
        }
        return alicePrivate;
    }

public Integer crackBob() {
        // TODO

        Integer bobPrivate = 0;
        Integer a = crackAlice();
        int p = session.getP();
        int g = session.getG();
        int A = session.getAlicesPublicKey();
        String mainMessage = "teade";

        String msg = null;
        try {
            msg = session.getEncrypted(mainMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }

        for (int i = 1; i < p; i++) {
            int ai = a*i;
            int Ai = A*i;
            //System.out.println("a*b = "+ai);
            BigInteger bigintP = BigInteger.valueOf(p);
            if (((BigInteger.valueOf(g).pow(a).mod(bigintP)).pow(i)).mod(bigintP)
                    .equals(((BigInteger.valueOf(g).pow(i).mod(bigintP)).pow(a)).mod(bigintP))) {
                String decrypt = null;
                try {
                    decrypt = session.getDecryptedWithCustomKey(msg, BigInteger.valueOf(g).pow(a*i).mod(bigintP).intValue());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (decrypt != null && decrypt.trim().equals(mainMessage)) {
                    bobPrivate = i;
                    break;
                }
            }
        }
        return bobPrivate;
    }

我希望这会帮助其他类似的问题。

© www.soinside.com 2019 - 2024. All rights reserved.