web-dev-qa-db-fra.com

Comment convertir une chaîne hexadécimale en un tableau d'octets et un tableau d'octets dans la chaîne hexadécimale?

La procédure de code suivante bytes = parseHexString (createHexString (bytes)) mène à mis à jour de bytes, ce que j'aimerais éviter. Et par conséquent, les calculs ne sont pas corrects.

<html>
<head>
<SCRIPT SRC="http://eu.static.mega.co.nz/sjcl_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/crypto_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/rsa_1.js"></SCRIPT>
<SCRIPT SRC="http://eu.static.mega.co.nz/hex_1.js"></SCRIPT>
<SCRIPT>
function parseHexString(str) { 
    var result = [];
    while (str.length >= 2) { 
        result.Push(parseInt(str.substring(0, 2), 16));
        str = str.substring(2, str.length);
    }

    return result;
}

function createHexString(arr) {
    var result = "";
    for (i in arr) {
        var str = arr[i].toString(16);
        str = str.length == 0 ? "00" :
              str.length == 1 ? "0" + str : 
              str.length == 2 ? str :
              str.substring(str.length-2, str.length);
        result += str;
    }
    return result;
}

function t()
{
    var json_k     = 'aOrP5yLtNQT53WMQfufSlA';
    var json_csid  = 'CABD6JUMldvI_eqP0537xl9P8x7kgk2OjOq99Fy7kosphj6AFUtlbwRRDpg4EIifXRLO6FNpdD22WwtUlJ_1Mgye2Y87trEqLCbhahuEFJVQNMDtNbIem7xY2ER9uF-cdgBXZWuzp7XIBybSh7W8MSUlv_eGS6LcLGJ81Q49dSzVhcswHTJ_IJl04p3c0axR6ZIJ8dH5bJ_vXvgQsypUVVtdfMacKhB9cXdEtRZ6iWLKCKqscXdo6CNXlbIdzRhro0gxfmhfB_miysFAiSQrbtuYnIgYBU3i9p3jRlPD4ti3CUcnj0SomV61w1aEYNvo56HPMUZlVkVHA7BFzvHGHo0J';
    var json_privk = 'K7LDtk2M2QhjJx_v_Hqf0LKUBaZx76U_vBDjQty9HpFDy2MntF5HxxuyHQ9-1HmXeYzbL1pZnAxsZ7LRUbDnkR6qtJVaGdWuQhrytkuq0l5zBp-O--gZxoQPRGTsVgVRdAvpsRTkQI_q8fxADLCe0womFxtvvnD_FJgjaMsm7vkYchXkoq33WWyHijb3JMkymjl0_GtiSamT0qEL6sm_l5Z1lehqBGUEHfYAa0ub8IDx_yqy2R9Nh8Lwzmz4s24sShVxjaNsMBlSE-sEvTziOsnNWK1Zl_XUYadlENkweuIoxYx_lt8XIV71TzjEFuVTd-pXhzVlqePmIu3SM3bO1Kzq_DnGfB62RmzlmbtHU4iyw4Hd1wQFRhTeSRrvMjsMPFKN-SIIQU7CRNaMuaDxZbNZcOKhMg_h9mApM0rRS3VZaGZzFTL9rSaDMYHw4pL3aOkSFPMY3w785Tss7Zqwuo9HFUWUVbnYAb97JkgCohlMotORrMMtual1dQ4sG1sIYXyWTckAGGL0ZAGurhtSKiyz1m8Lb39pXPacqFh_nCHqqb2_RdrKTj0PdGZESKkU8YedeqC1I9nR4v38DuQc-pBBR5DOwgNjJMvzvsUehs_PxIL8THjgIcr7ONc4hWV9o2v_l81Vo2cCW2I99Iz84IFN2fV1dTqHIG_tnLzz8ljBVygETUqrFdZ0JlQJkurZ7RBku5krm-k9CZmDezCIzPPil-RcYzVIk00gNYAxfiZE48Or4WEiGjgKLnHCYVtSlvlMF4bPGB4SVCZ-68j49EjfSWaMK0OoMkpGhqf7KchgxYBZq6o3AhLgp4t0BClvsdee6VTz1SFqc3m2A-TMG6fNdbCT_Q9nYCYdZIROdOc';

    var aes = new sjcl.cipher.aes( prepare_key_pw("oEyoo9cQcw") );
    k = decrypt_key(aes, base64_to_a32(json_k) );

    aes = new sjcl.cipher.aes(k);

    var t = mpi2b(base64urldecode(json_csid));

    var privk = a32_to_str(decrypt_key(aes,base64_to_a32(json_privk)));

    var rsa_privk = Array(4);
    for (var i = 0; i < 4; i++)
    {
        var l = ((privk.charCodeAt(0)*256+privk.charCodeAt(1)+7)>>3)+2;

        rsa_privk[i] = mpi2b(privk.substr(0,l));
        if (typeof rsa_privk[i] == 'number') break;
        privk = privk.substr(l);    
    }

    var p = parseHexString(createHexString(rsa_privk[0]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    var q = parseHexString(createHexString(rsa_privk[1]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    var d = parseHexString(createHexString(rsa_privk[2]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    var u = parseHexString(createHexString(rsa_privk[3]));  // !!!!!!!!!!!!!!!!!!!!!!!!!!!!
    sid = base64urlencode(b2s(RSAdecrypt(t,d,p,q,u)).substr(0,43));
    if (sid!=='tajetAbW0qTQGFlwp8iD5lQ0TFV1QUZJZFVvjRX7Xx-bPzYBoau7qog09w')
        console.log("ERROR");

    p = rsa_privk[0];
    q = rsa_privk[1];
    d = rsa_privk[2];
    u = rsa_privk[3];
    sid = base64urlencode(b2s(RSAdecrypt(t,d,p,q,u)).substr(0,43));
    if (sid=='tajetAbW0qTQGFlwp8iD5lQ0TFV1QUZJZFVvjRX7Xx-bPzYBoau7qog09w')
        console.log("OK");
}
</script>

</head>
<body onload="t();"></body>
</html>

Je ne suis pas un développeur javascript, et aucun de ceux trouvés dans le code de Google ne fonctionnait pas sur cette donnée.

Mise à jour 1

console.log(createHexString(rsa_privk[0])); = e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed62d2757968 

Mais si fais 

parseHexString('e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed‌​62d2757968'); 

alors code if (sid!== ... faire une erreur

Mise à jour 2

console.log(rsa_privk[0].toString(16));

sortie: 123676133V-1 80725759,89608310,85166267,200925925,254033325,86971506,191278317,127411298,180195794,142776693,188738169,39016 

Mise à jour 3

console.log(parseHexString(createHexString(rsa_privk[0])));
console.log(rsa_privk[0]);

sortie:

[229, 209, 9, 198, 115, 216, 239, 3, 223, 86, 75, 235, 158, 54, 233, 152, 58, 35, 132, 43, 10, 114, 78, 250, 69, 255, 118, 187, 229, 173, 114, 237, 98, 210, 117, 121, 104]

[123676133, 198914513, 129998601, 245147334, 11918451, 206998232, 96766191, 75984899, 177840095, 106709334, 10180427, 208237547, 119814814, 127003446, 189062377, 84099480, 220452154, 250519075, 267883908, 115471915, 165124106, 238628722, 169382478, 42320122, 95982405, 80725759, 89608310, 85166267, 200925925, 254033325, 86971506, 191278317, 127411298, 180195794, 142776693, 188738169, 39016]
16
SkyN

Update: Faites défiler la liste pour trouver la solution ... Démo en direct

Le problème: vous utilisez une conversion avec perte en hexadécimal, qui ne peut pas être inversée.

var p = parseHexString(createHexString(rsa_privk[0]));

Ce ne sera jamais la même chose que rsa_privk[0].

En effet, createHexString() utilise uniquement le last 2 bytes de chaque élément du tableau.

Exemple:

rsa_privk[0] : [123676133, 198914513, 129998601, 245147334, 11918451, 206998232, 96766191, 75984899, 177840095, 106709334, 10180427, 208237547, 119814814, 127003446, 189062377, 84099480, 220452154, 250519075, 267883908, 115471915, 165124106, 238628722, 169382478, 42320122, 95982405, 80725759, 89608310, 85166267, 200925925, 254033325, 86971506, 191278317, 127411298, 180195794, 142776693, 188738169, 39016]

createHexString(rsa_privk[0]) : e5d109c673d8ef03df564beb9e36e9983a23842b0a724efa45ff76bbe5ad72ed62d2757968

parseHexString(createHexString(rsa_privk[0])) : [229, 209, 9, 198, 115, 216, 239, 3, 223, 86, 75, 235, 158, 54, 233, 152, 58, 35, 132, 43, 10, 114, 78, 250, 69, 255, 118, 187, 229, 173, 114, 237, 98, 210, 117, 121, 104] 

Mise à jour: Solution de travail ...

Les deux fonctions ... l'hex contient toujours 8 blocs d'octets, chacun pour chaque élément du tableau ...

function parseHexString(str) { 
    var result = [];
    while (str.length >= 8) { 
        result.Push(parseInt(str.substring(0, 8), 16));

        str = str.substring(8, str.length);
    }

    return result;
}

function createHexString(arr) {
    var result = "";
    var z;

    for (var i = 0; i < arr.length; i++) {
        var str = arr[i].toString(16);

        z = 8 - str.length + 1;
        str = Array(z).join("0") + str;

        result += str;
    }

    return result;
}

Code de test ...

function test() {   
    a = [123676133, 198914513, 129998601, 245147334, 11918451, 206998232, 96766191, 75984899, 177840095, 106709334, 10180427, 208237547, 119814814, 127003446, 189062377, 84099480, 220452154, 250519075, 267883908, 115471915, 165124106, 238628722, 169382478, 42320122, 95982405, 80725759, 89608310, 85166267, 200925925, 254033325, 86971506, 191278317, 127411298, 180195794, 142776693, 188738169, 39016];

    console.log("Input");
    console.log(a);

    b = createHexString(a);

    console.log("Hex");
    console.log(b);

    c = parseHexString(b); 

    console.log("Output");
    console.log(c);

    if(checkIfEqual(a, c)) {
        alert("Same");
    }
}

function checkIfEqual(arr1, arr2) {
    if (arr1.length != arr2.length) {
        return false;
    }
    //sort them first, then join them and just compare the strings
    return arr1.sort().join() == arr2.sort().join();
}
10
ATOzTOA

Convertit une chaîne hexadécimale en un tableau d'octets et vice versa

note: implémentation de crypto-js

// Convert a hex string to a byte array
function hexToBytes(hex) {
    for (var bytes = [], c = 0; c < hex.length; c += 2)
    bytes.Push(parseInt(hex.substr(c, 2), 16));
    return bytes;
}

// Convert a byte array to a hex string
function bytesToHex(bytes) {
    for (var hex = [], i = 0; i < bytes.length; i++) {
        var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];
        hex.Push((current >>> 4).toString(16));
        hex.Push((current & 0xF).toString(16));
    }
    return hex.join("");
}
23
Quark

Je voulais juste dire qu'il existe une bibliothèque sur https://github.com/dcodeIO/bytebuffer.js pour vous aider facilement lors de conversions de ce type, et vous n'avez donc pas besoin d'écrire vos propres fonctions ( ce qui pourrait ne pas être le plus optimal, ou être plus optimal si votre solution était passée en revue par la communauté open source sur GitHub).

var ByteBuffer = require("bytebuffer");

var bb = ByteBuffer.fromHex(yourHexString);

// need to convert it to base 64?
// bb.toBase64();

Voir https://github.com/dcodeIO/bytebuffer.js/wiki/API#bytebufferfromhexstr-littleendian-noassert pour la documentation de l'API et un aperçu des méthodes que j'ai utilisées ci-dessus.

6
niftylettuce

Pour clarifier, si vous voulez simplement décoder hexadécimalement une chaîne simple telle que 48656C6C6F20576F726C6421 (Hello World!), vous pouvez utiliser la fonction OP mais au lieu d'utiliser une longueur de 8, vous devez utiliser une longueur de 2.

Code:

var DecodeHexStringToByteArray = function (hexString) {
   var result = [];
   while (hexString.length >= 2) { 
       result.Push(parseInt(hexString.substring(0, 2), 16));
       hexString = hexString.substring(2, hexString.length);
   }
   return result;
}

La sortie sera [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

Je sais que ce code est déjà dans la question du PO, mais ce n'est pas dans la réponse acceptée. Mon intention ici est uniquement de donner une réponse directe à la première partie de la question posée (How to convert a hex string into a bytes array).

0
newlog

Voici un échantillon live pour ce test.

http://jsfiddle.net/vincentwang2020/eks1z4g2/

function testcreateHexString()
{
    alert('test function createHexString');
    var key = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];
    var result = createHexString(key);
    alert ('Hex value:' + result);

    alert('test function parseHexString');

    var key2 = parseHexString(result);

    if (key.sort().join() == key2.sort().join())
        alert ('Matched');

}
0
Vincent