Ответы пользователя по тегу Криптография
  • Как перенести объект из JS в другие языки?

    @GrayHorse
    в каком виде CryptoJS принимает в себя инстанс объекта самого себя и что он хеширует, чтобы повторить этот метод используя другие инструменты


    Все криптографические алгоритмы работают с байтами. CryptoJS используется абстракцию в виде класса "WordArray" для представления байтов, т.к. это старая библиотека, написанная, когда не было "ArrayBuffer".

    мне надо чтобы оно НЕ РАБОТАЛО также как и НЕ РАБОТАЕТ в js,

    Оно работает. Причем правильно.

    неужели по Вашему я могу переместиться во времени и пространстве к программисту, который когда-то захешировал слово таким методом и сказать ему "эй, ты хешируешь объект, не надо, хешируй строку" и дать ему этот код?

    На что тот программист бы ответил: "Не неcи чушь".
    И будет прав.

    Т.к. в его случает программа берет байты из строки и хешерует их, потом опять хеширует их же и т.д:
    SHA512(
            SHA512(
                    SHA512("hello".getBytes()) 
            )
    ).toString("hex");

    Для вывода в консоль предстaвляет их в виде хекс строки.

    ---

    Хеши же от вывода якобы той программы на C++:
    SHA512(
            SHA512(
                    SHA512("hello".getBytes()).toString("hex").getBytes()
            ).toString("hex").getBytes()
    ).toString("hex");

    Ничего не смущает? Что здесь cчитается не то же самое.

    ---

    чтобы повторить этот метод используя другие инструменты


    Другие инструменты в виде Java:

    import java.math.BigInteger;
    import java.nio.charset.StandardCharsets;
    import java.security.*;
    
    public class Main {
        public static void main(String[] args) throws NoSuchAlgorithmException {
            byte[] bytesOfMessage = "hello".getBytes(StandardCharsets.UTF_8);
            MessageDigest SHA512 = MessageDigest.getInstance("SHA512");
    
            byte[] digest = SHA512.digest(bytesOfMessage);
            Main.log(digest);
            for (int i = 0; i < 4; i++) {
                digest = SHA512.digest(digest);
                Main.log(digest);
            }
        }
        private static void log(byte[] digest) {
            var hex = new BigInteger(1, digest).toString(16);
            if (hex.length() % 2 == 1) {
                hex = "0" + hex;
            }
            System.out.println(hex);
        }
    }


    Шок! Вывод такой же и у "неправильного" CryptoJS. Банковские приложения в опасносте!

    ---

    Тема — кринж.
    Ответ написан
    1 комментарий