µLua DS - Forum officiel | Official forum Index du Forum

µLua DS - Forum officiel | Official forum
Le bon endroit pour en savoir plus sur MicroLua et pour parler de vos projets ! | The right place to learn more about MicroLua and talk about your projects !

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer   ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

[Lua/lib]Calcul du sha1

 
Poster un nouveau sujet   Répondre au sujet    µLua DS - Forum officiel | Official forum Index du Forum -> Section française -> Coin du dév' -> Librairies
Sujet précédent :: Sujet suivant  
Auteur Message
Papymouge
Modérateur

Hors ligne

Inscrit le: 10 Mai 2009
Messages: 693
Localisation: Vittel (88)

MessagePosté le: Lun 17 Sep 2012 - 17:00    Sujet du message: [Lua/lib]Calcul du sha1 Répondre en citant

SHA1 


Cette librairie calcul l'empreinte unique d'une phrase ou d'un fichier. Comme elle est codé en lua pure et utilise la librairie libbin.lua se trouvant ici , le calcul est hummm comment dire, très très lent(dû aussi au fait de la rapidité des processeurs de chère console.) Pour une estimation du temps de calcul pour une NDS lite c'est par ici.

Comme je l'ai fait, et que je veut pas le mettre à la poubelle, je vous le fournis ici.

Utilisation:
copier le code source et le coller dans un fichier au doux nom de sha1.lua
puis on fait un dofile("sha1.lua")

 - Calcul de sha1 sur une phrase:
  resultat= sha1.compute(phrase)
  phrase: (string) la phrase à calculer
  resultat: (string) le résultat du sha1

 - Calcul du sha1 sur un fichier:
  resultat = sha1.computeFile(fichier)
  fichier: (string) le chemin complet du fichier à calculer
  resultat: (string) le résultat du sha1



 
Code:
require("libbin")
sha1 = {}
sha1.init = function ()
    A,B,C,D,E = 0,0,0,0,0
    H = {tonumber("67452301",16), tonumber("EFCDAB89",16), tonumber("98BADCFE",16),
            tonumber("10325476",16), tonumber("C3D2E1F0",16)}
    W = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    sha1.messageLengthHight = 0
    sha1.messageLengthLow   = 0
    sha1.wordSupp = ""
end

-- 0 >= sentence.length <= 512bits
-- 0 >= string.len(sentence) <=64 chars
sha1.padding = function (sentence)
    local buff = {}
    local sbin = ""
    local i,j,k
    local nb = string.len(sentence)
    local tmp = 4294967295 - sha1.messageLengthLow
    if(tmp > (nb*8)) then
        sha1.messageLengthLow = sha1.messageLengthLow + (nb*8)
    else
        sha1.messageLengthLow = (nb*8) - tmp
        sha1.messageLengthHight = sha1.messageLengthHight + 1
    end
    for i=1, nb do
        sbin = sbin..libbin.fill(libbin.tobin(string.byte(string.sub(sentence,i,i))),8)
    end
    if(string.len(sbin) < 447) then
        sbin = sbin.."1"
        sbin = sbin..string.rep("0",448 - string.len(sbin))
        sbin = sbin..libbin.fill(libbin.tobin(sha1.messageLengthHight),32)
        sbin = sbin..libbin.fill(libbin.tobin(sha1.messageLengthLow),32)
        sha1.wordSupp = nil -- besoin de rien de plus
    elseif(string.len(sbin) < 512) then
        sbin = sbin.."1"
        sbin = sbin..string.rep("0",512 - string.len(sbin))
        sha1.wordSupp = string.rep("0",448)
        sha1.wordSupp = sha1.wordSupp..libbin.fill(libbin.tobin(sha1.messageLengthHight),32)
        sha1.wordSupp = sha1.wordSupp..libbin.fill(libbin.tobin(sha1.messageLengthLow),32)
    else
        sha1.wordSupp = "1"
        sha1.wordSupp = sha1.wordSupp..string.rep("0",447)
        sha1.wordSupp = sha1.wordSupp..libbin.fill(libbin.tobin(sha1.messageLengthHight),32)
        sha1.wordSupp = sha1.wordSupp..libbin.fill(libbin.tobin(sha1.messageLengthLow),32)
    end
    return sbin
end

sha1.explode = function(s512)
    local buff = {}
    local i,j = 0,1
    for i=1,16 do
        buff[i] = libbin.toint(string.sub(s512,j,j+31))
        j = j + 32
    end
    return buff
end

sha1.tohex = function(int)
    return string.format("%08X",int)
end

sha1.comp = function (tabComp)
    local i,temp
    for i=1, 16 do
        W[i] = tabComp[i]
    end
    for i=17, 80 do
        W[i] = libbin.rlbs(libbin.bxor(libbin.bxor(libbin.bxor(W[i-3],W[i-8]),W[i-14]),W[i-16]),1)
    end
    A = H[1]
    B = H[2]
    C = H[3]
    D = H[4]
    E = H[5]
    for i=1,80 do
        if(i < 21) then
            f = libbin.bor(libbin.band(B,C),libbin.band(libbin.bnot(B),D))
            K = tonumber("5A827999",16)
        elseif(i < 41) then
            f = libbin.bxor(libbin.bxor(B,C),D)
            K = tonumber("6ED9EBA1",16)
        elseif(i < 61) then
            f = libbin.bor(libbin.bor(libbin.band(B,C),libbin.band(B,D)),libbin.band(C,D))
            K = tonumber("8F1BBCDC",16)
        else
            f = libbin.bxor(libbin.bxor(B,C),D)
            K = tonumber("CA62C1D6",16)
        end
        temp = (libbin.rlbs(A,5) + f + E + W[i] + K) % math.pow(2,32)
        E = D
        D = C
        C = libbin.rlbs(B,30)
        B = A
        A = temp
    end
    H[1] = (H[1] + A) % math.pow(2,32)
    H[2] = (H[2] + B) % math.pow(2,32)
    H[3] = (H[3] + C) % math.pow(2,32)
    H[4] = (H[4] + D) % math.pow(2,32)
    H[5] = (H[5] + E) % math.pow(2,32)
end

sha1.compute = function(sentence)
    local buff = ""
    local i
    sha1.init()
    if(string.len(sentence)==0) then
        buff = sha1.padding(sentence)
        sha1.comp(sha1.explode(buff))
    else
        for i=1, string.len(sentence), 64 do
            buff = sha1.padding(string.sub(sentence,i,i+63))
            sha1.comp(sha1.explode(buff))
        end
        if(sha1.wordSupp ~= nil) then
            sha1.comp(sha1.explode(sha1.wordSupp))
        end
    end
    return string.format("%08x%08x%08x%08x%08x",H[1],H[2],H[3],H[4],H[5])
end

sha1.computeFile = function(file)
    local buff = ""
    local i,ll
    local f1 = io.open(file,"r")
    if (f1) then
        sha1.init()
        ll = f1:read(64)
        while ll ~= nil do
            buff = sha1.padding(ll)
            sha1.comp(sha1.explode(buff))
            ll = f1:read(64)
        end
        io.close(f1)
        if(sha1.wordSupp ~= nil) then
            sha1.comp(sha1.explode(sha1.wordSupp))
        end
        return string.format("%08x%08x%08x%08x%08x",H[1],H[2],H[3],H[4],H[5])
    else
        return nil
    end
end



_________________
La page de mes projets
L'ancienne page de mes projets


Revenir en haut
Publicité






MessagePosté le: Lun 17 Sep 2012 - 17:00    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
thermo_nono
Modérateur

Hors ligne

Inscrit le: 31 Déc 2008
Messages: 2 415
Localisation: La Géhenne

MessagePosté le: Mar 18 Sep 2012 - 01:04    Sujet du message: [Lua/lib]Calcul du sha1 Répondre en citant

C'est vrai que ça semble un peu long.. mais bon, quelqu'un en aura peut-être l'utilité un jour. 
_________________
“Qui reçoit une idée de moi reçoit de la connaissance sans diminuer la mienne, comme celui qui allume sa chandelle à la mienne reçoit la lumière sans me plonger dans l’obscurité.” - Thomas Jefferson


Revenir en haut
Visiter le site web du posteur MSN
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 08:54    Sujet du message: [Lua/lib]Calcul du sha1

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    µLua DS - Forum officiel | Official forum Index du Forum -> Section française -> Coin du dév' -> Librairies Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com