Avatar billede hypotroch00id Nybegynder
18. juli 2010 - 14:25 Der er 9 kommentarer og
1 løsning

sha1 implementeret i .NET med C#

Hej!
jeg har meget brug for en fuldstændig solid og troværdig beregning af SHA1 værdien af et tal som jeg har fået opgivet i hex : 3045ae6f c8422f64 ed579528 d38120ea e12196d5
Jeg skal anvendes outputtet i binært format.
Jeg anvender .NETs sha1 og får at tallet i decimalform er 275585503993527016686210752207080241786546919125 og at hashværdien af dette tal binært er 101111110111010001011001001100110101010101110100011111110111111010101001011011101110000000001101010111011111010111100000100000111000101111101001101011010000001.
jeg anvender følgende implementation
(inspireret af lidt hjælp jeg fik tidligere :))
private void button1_Click(object sender, EventArgs e)
        {
            BigInteger num = BigInteger.Parse(textBox1.Text);
            byte[] data = num.ToByteArray();
            byte[] result;
           
            StringBuilder sb = new StringBuilder();
            SHA1 sha = new SHA1CryptoServiceProvider();
            result = sha.ComputeHash(data);
            for (int i = result.Length - 1; i >= 0; i--)
            {
                sb.Append(Convert.ToString(result[i], 2).PadLeft(8, '0'));
            }
         
            textBox2.Text =  sb.ToString().TrimStart('0');
        }

Jeg har så en helt anden checksum på det her som det altsammen skal matche med  - og det gør det ikke, så jeg kan konstatere at noget må gå galt i min implementation...

Er der nogen der kan se om det er en korrekt måde at tage sha1 værdien af et tal på?

PS: Jeg har valgt at tro at det er af tallet fortolket som tal og ikke som tekststreng jeg skal beregne sha1 af - det giver noget helt andet og er helt hen i vejret hvis jeg fortolker det som en tekststreng, da det så naturligvis vil være helt forskelligt om min input er decimalt, med eller uden mellemrum osv og i specifikationens sammenhæng er værdierne entydige og absolutte nogle steder angivet i decimalform andre steder i hex.
Avatar billede hypotroch00id Nybegynder
18. juli 2010 - 14:26 #1
ja igen disse lange binære tal der ikke kan ombrydes derfor hermed:
1011111101110100010110010011001101010101011101000111111101/
1111101010100101101110111000000000110101011101111101011110/
0000100000111000101111101001101011010000001
Avatar billede arne_v Ekspert
18. juli 2010 - 14:43 #2
SHA1 er veldefineret - den er som den er.

Dit problem er hvilke bytes du skal udregne SHA1 af.

tekst som ASCII/ISO-8859-1/UTF-8
tekst som UTF-16
binaert minimum bytes
binaert multipl af 4 bytes

Grundliggende boer du have noget dokumentation af dette. Det er vel programmering og ikke en gaette konkurrence.

Hvis du poster en vaerdi og de rigtige SHA1, saa kan vi evt. hjaelpe dig med at gaette.
Avatar billede hypotroch00id Nybegynder
18. juli 2010 - 15:08 #3
tak for respons :)
....problemet er at det er lidt mere komplekst end som så - sha1 indgår blot som en delmængde af verifikationen.
appendix 6.5 (s 64)  i fips-186-2 her:
http://csrc.nist.gov/publications/fips/archive/fips186-2/fips186-2.pdf.
og jeg er i gang med at verificere P-192 (s 29).
Så jeg har altså et kendt indput s og et kendt output  c af en algoritme hvori indgår en sha1 funktion

Jeg skulle allerhest tage sha1 direkte på den binære værdi af strengen (det er ikke specificeret yderligere) og vil gerne sikre mig at det i det mindste ikke er min sha1 anvendelse der får det til at skramle :)

jeg sidder møgsommeligt og håndbroderer det første eksempel her vha af Maple for at fjerne den største fejlkilde. (den elendige programmine)
sha1 kan dog ikke så godt håndsyes.

Derfor vil jeg blot sikre mig at SHA1 er anvendt korrekt.
Jeg har læst at SHA1 ifgl certicom ikke er implementeret fejlfri efter fips standard - men gætter på at fejlen nærmere er min end microsofts ;)
Avatar billede arne_v Ekspert
19. juli 2010 - 02:34 #4
Jeg kan ikke gennemskue det der foregår på side 29.

Men .NET SHA1 ser ud til at virke fint.

http://en.wikipedia.org/wiki/Examples_of_SHA_digests#SHA-1_hashes

using System;
using System.Text;
using System.Security.Cryptography;

namespace E
{
    public class Program
    {
        public static string SHA1(String s)
        {
            HashAlgorithm alg = new SHA1Managed();
            byte[] b = Encoding.ASCII.GetBytes(s);
            alg.TransformFinalBlock(b, 0, b.Length);
            return BitConverter.ToString(alg.Hash).Replace("-", "");
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(SHA1("The quick brown fox jumps over the lazy dog"));
            Console.WriteLine(SHA1(""));
            Console.ReadKey();
        }
    }
}

2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12
DA39A3EE5E6B4B0D3255BFEF95601890AFD80709
Avatar billede hypotroch00id Nybegynder
19. juli 2010 - 08:40 #5
Herligt :)
jeg ser at det er en løsning hvor teksten tolkes som ASCII.

Nu mangler jeg bare at kunne kontrollere input formatet for jeg får ikke det ønskede output med din løsning.

Jeg har nu fundet to sammenhørende par hvor jeg kender den direkte korrekte værdi af en hashing med sha1, som giver det det skal (dvs jeg kan verificere det tidligere nævnte med præcis disse hashværdiher)

s= bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc5
sha1(s)= 2f7923f33d5eab4215c2fc265b056c7e11dd68f4

t=bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc6
Sha1(t)= 0469ee7f3c7a7d74f7d121116506d031218291fb


Det er sjovt nok den her translator der kan klare det (en PHP løsning med OpenSSL i baghånden):
http://home3.paulschou.net/tools/xlate/
(kildekoden kan downloades)

Men jeg kan ikke gennemskue hvorfor det giver det rigtige resultat og den version du har lavet ikke giver det samme.

Hans løsning bruger tilsyneladende også ASCII..
men oversætter hex til ASCII således:

if($hex != "") {
    $hex_ = preg_replace("/[^0-9a-fA-F]/","", $hex);
    for($i = 0; $i < strlen($hex_); $i = $i + 2)
    $ascii = $ascii.chr(hexdec(substr($hex_, $i, 2)));
}

Det giver ikke det samme som C#'s Encoding.ASCII.GetBytes(s)
Er der mon en måde at oversætte til ASCII på uden at gå omkring strengformatet ?
Avatar billede hypotroch00id Nybegynder
19. juli 2010 - 09:01 #6
Er der forresten nogen fordele ved at bruge SHA1Managed() frem for SHA1CryptoServiceProvider() ?
Avatar billede arne_v Ekspert
19. juli 2010 - 15:57 #7
Jeg mener at SHA1Managed er en ren .NET implementation mens SHA1CryptoServiceProvider kalder noget native kode i Windows.
Avatar billede arne_v Ekspert
19. juli 2010 - 16:06 #8
De tal kan jeg genskabe med:

using System;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;

namespace E
{
    public class Program
    {
        public static byte[] FromHex(string s)
        {
            byte[] ba = new byte[s.Length/2];
            for(int i = 0; i < ba.Length; i++)
            {
                ba[i] = byte.Parse(s.Substring(2 * i, 2), NumberStyles.HexNumber);
            }
            return ba;
        }
        public static string HexSHA1(String s)
        {
            HashAlgorithm alg = new SHA1Managed();
            byte[] b = FromHex(s.Replace(" ", ""));
            alg.TransformFinalBlock(b, 0, b.Length);
            return BitConverter.ToString(alg.Hash).Replace("-", "");
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(HexSHA1("bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc5"));
            Console.WriteLine(HexSHA1("bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc6"));
            Console.ReadKey();
        }
    }
}
Avatar billede hypotroch00id Nybegynder
19. juli 2010 - 17:03 #9
Fantastisk! tusind tak. :)
smukt med direkte oversættelse af hex til byte.
Vil du ikke ha point?
Avatar billede arne_v Ekspert
19. juli 2010 - 17:06 #10
gerne
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester