Kurvenname für private und public key erzeugung

As a guest you will only see a limited part of what is going on.
Register now for free and see the whole range of the eMark community!
  • Hallo,
    arbeite gerade an meinem Offline-Bitcoin-Wallet Drucker mit einem Raspberry Pi und das funktioniert soweit schon ganz gut (zumindest das drucken von Adresse und QR-Code). Nun wollte ich das ganze auf die DEM portieren und nun stellt sich die Frage wie der CURVE_NAME für die DEM ist. In dem Quellcode den ich verwende ist der für Bitcoin "NID_secp256k1". Vielleicht kann mir den mal Posten jemand posten. Wenn alles funktioniert und auch gut aussieht, werde ich das ganze etwas detaillierter beschreiben, wenn das jemand möchte. Rein von dem was ich so gesehen habe an Adressen sollte das "NID_secp256kN" aber bevor ich auch nur eine meiner Kostbaren DEM für eine Testüberweisung verschwende Frage ich lieber.


    MFG r37r0

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

  • Ok, so leicht war es dann doch nicht. Beim compilieren macht er gleich fehler. hier der Code. Vieleicht weiss ja jemand was mann ändern muss.

    Code
    #include <stdio.h>#include <string.h>#include <math.h>#include <assert.h>#include <openssl/evp.h>#include <openssl/bn.h>#include <openssl/ec.h>#include <openssl/obj_mac.h>#if !defined(_WIN32)#include <unistd.h>#else#include "winglue.h"#endifconst char *vg_b58_alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";void vg_b58_encode_check(void *buf, size_t len, char *result){        unsigned char hash1[32];        unsigned char hash2[32];        int d, p;        BN_CTX *bnctx;        BIGNUM *bn, *bndiv, *bntmp;        BIGNUM bna, bnb, bnbase, bnrem;        unsigned char *binres;        int brlen, zpfx;        bnctx = BN_CTX_new();        BN_init(&bna);        BN_init(&bnb);        BN_init(&bnbase);        BN_init(&bnrem);        BN_set_word(&bnbase, 58);        bn = &bna;        bndiv = &bnb;        brlen = (2 * len) + 4;        binres = (unsigned char*) malloc(brlen);        memcpy(binres, buf, len);        SHA256(binres, len, hash1);        SHA256(hash1, sizeof(hash1), hash2);        memcpy(&binres[len], hash2, 4);        BN_bin2bn(binres, len + 4, bn);        for (zpfx = 0; zpfx < (len + 4) && binres[zpfx] == 0; zpfx++);        p = brlen;        while (!BN_is_zero(bn)) {                BN_div(bndiv, &bnrem, bn, &bnbase, bnctx);                bntmp = bn; int brlen, zpfx;        bnctx = BN_CTX_new();        BN_init(&bna);        BN_init(&bnb);        BN_init(&bnbase);        BN_init(&bnrem);        BN_set_word(&bnbase, 58);        bn = &bna;        bndiv = &bnb;        brlen = (2 * len) + 4;        binres = (unsigned char*) malloc(brlen);        memcpy(binres, buf, len);        SHA256(binres, len, hash1);        SHA256(hash1, sizeof(hash1), hash2);        memcpy(&binres[len], hash2, 4);        BN_bin2bn(binres, len + 4, bn);        for (zpfx = 0; zpfx < (len + 4) && binres[zpfx] == 0; zpfx++);        p = brlen;        while (!BN_is_zero(bn)) {                BN_div(bndiv, &bnrem, bn, &bnbase, bnctx);                bntmp = bn;                bn = bndiv;                bndiv = bntmp;                d = BN_get_word(&bnrem);                binres[--p] = vg_b58_alphabet[d];        }        while (zpfx--) {                binres[--p] = vg_b58_alphabet[0];        }        memcpy(result, &binres[p], brlen - p);        result[brlen - p] = '\0';        free(binres);        BN_clear_free(&bna);        BN_clear_free(&bnb);        BN_clear_free(&bnbase);        BN_clear_free(&bnrem);        BN_CTX_free(bnctx);}void vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result){        unsigned char eckey_buf[128];        const BIGNUM *bn;        int nbytes;        bn = EC_KEY_get0_private_key(pkey);           bndiv = bntmp;                d = BN_get_word(&bnrem);                binres[--p] = vg_b58_alphabet[d];        }        while (zpfx--) {                binres[--p] = vg_b58_alphabet[0];        }        memcpy(result, &binres[p], brlen - p);        result[brlen - p] = '\0';        free(binres);        BN_clear_free(&bna);        BN_clear_free(&bnb);        BN_clear_free(&bnbase);        BN_clear_free(&bnrem);        BN_CTX_free(bnctx);}void vg_encode_privkey(const EC_KEY *pkey, int addrtype, char *result){        unsigned char eckey_buf[128];        const BIGNUM *bn;        int nbytes;        bn = EC_KEY_get0_private_key(pkey);        eckey_buf[0] = addrtype;        nbytes = BN_num_bytes(bn);        assert(nbytes <= 32);        if (nbytes < 32)                memset(eckey_buf + 1, 0, 32 - nbytes);        BN_bn2bin(bn, &eckey_buf[33 - nbytes]);        vg_b58_encode_check(eckey_buf, 33, result);}void vg_encode_address(const EC_POINT *ppoint, const EC_GROUP *pgroup, int addrtype, char *result){        unsigned char eckey_buf[128], *pend;        unsigned char binres[21] = {0,};        unsigned char hash1[32];        pend = eckey_buf;        EC_POINT_point2oct(pgroup,                           ppoint,                           POINT_CONVERSION_UNCOMPRESSED,                           eckey_buf,                           sizeof(eckey_buf),                           NULL);        pend = eckey_buf + 0x41;        binres[0] = addrtype;        SHA256(eckey_buf, pend - eckey_buf, hash1);        RIPEMD160(hash1, sizeof(hash1), &binres[1]);        nbytes = BN_num_bytes(bn);        assert(nbytes <= 32);        if (nbytes < 32)                memset(eckey_buf + 1, 0, 32 - nbytes);        BN_bn2bin(bn, &eckey_buf[33 - nbytes]);        vg_b58_encode_check(eckey_buf, 33, result);}void vg_encode_address(const EC_POINT *ppoint, const EC_GROUP *pgroup, int addrtype, char *result){        unsigned char eckey_buf[128], *pend;        unsigned char binres[21] = {0,};        unsigned char hash1[32];        pend = eckey_buf;        EC_POINT_point2oct(pgroup,                           ppoint,                           POINT_CONVERSION_UNCOMPRESSED,                           eckey_buf,                           sizeof(eckey_buf),                           NULL);        pend = eckey_buf + 0x41;        binres[0] = addrtype;        SHA256(eckey_buf, pend - eckey_buf, hash1);        RIPEMD160(hash1, sizeof(hash1), &binres[1]);        vg_b58_encode_check(binres, sizeof(binres), result);}int main(int argc, char **argv){        char ecprot[128];        char pbuf[1024];        EC_KEY *pkey;        unsigned char *pend = (unsigned char *) pbuf;        int count = argc > 1 ? atoi(argv[1]) : 1;        OpenSSL_add_all_algorithms();        while(count-- > 0) {                pkey = EC_KEY_new_by_curve_name(NID_secp256k1);                EC_KEY_generate_key(pkey);                i2o_ECPublicKey(pkey, &pend);                vg_encode_address(EC_KEY_get0_public_key(pkey), EC_KEY_get0_group(pkey), 0, ecprot);                printf("Address: %s\n", ecprot);                vg_encode_privkey(pkey, 128, ecprot);                printf("Privkey: %s\n\n", ecprot);        }}



    Ich tippe auf diese Stelle

    Code
    pend = eckey_buf + 0x41;
            binres[0] = addrtype;
            SHA256(eckey_buf, pend - eckey_buf, hash1);
            RIPEMD160(hash1, sizeof(hash1), &binres[1]);
    
    
            vg_b58_encode_check(binres, sizeof(binres), result);


    aber ?. Wenn mir jemand die Adressunterschiede sagen könnte finde ich das auch selbst raus.
    MFG r37r0

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

  • Nein die Ecke ist es leider auch nicht ^^
    vieleicht BN_set_word(&bnbase, 58);
    MFG r37r0


    Nein die ist es auch nicht.^^

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

    Edited once, last by r37r0 ().

    • Official Post

    keine Ahnung wo der Fehler liegt, aber schau dir mal den Source code von www.bitadress.org an.
    Der funktioniert zu 100% offline hat also alles drin, was man zur Adresserstellung braucht und auch gleich QR macht.
    Hier ein paar mehr Infos: https://github.com/pointbiz/bitaddress.org
    Die Frage ist, was machen wir wenn alles funktioniert? Wo wollen wir die Keys dann einsetzen? Der Bitcoin Client unterstützt die Eingabe von privaten Keys nicht und mir ist auch keine Möglichkeit bekannt das bei DEM zu machen.

  • Hallo Fyuri,
    an sich gibt es keinen Fehler, der code ist halt für Bitcoins. Ich dachte man müsste vielleicht einfach nur eine kleine Stelle ändern um die portierbarkeit zur DEM zu ermöglichen. Ich hatte mir das digitale Wallet von Bitcoin bzw. DEM noch garnicht angeschaut. Halte das ganze für sehr unsicher, deshalb auch die "Paperwallets". Ich halte das für die einzige Möglichkeit schnell und sicher sein Geld zu sichern. Wenn es die Möglichkeit nicht gibt wäre die Bemühung auch vergebens. Ich dachte das man die PrivKeys im Wallet importieren kann. Schade. Naja wird noch kommen ^^.
    Werde mich, wenn ich etwas Zeit finde, versuchen Bitadress.org auf DEM zu portieren. Sinnvoll ist es allemal denn ich vertraue leider nicht der Sicherheit der "Online-Wechselstuben".
    Aber dennoch bleibt dort (Bitaddress.org portierung) die gleiche frage, es gibt für jede Währung einen Hauptschlüssel oder Merkmal, den man braucht um die Adressen zu generieren. Ohne den kommen wir da nicht weiter, ich hatte gehofft das ihr (das Forum) mir das einfach sagen könnt. Wer hat denn die Wallet portierung gemacht (bitte melden ^^).
    MFg r37r0


    Habe noch das gefunden "Aber vorsicht !!!!! Kann zu Coinverlust führen"
    https://en.bitcoin.it/wiki/How_to_import_private_keys_v7%2B


    Melde mich später nochmal

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

    • Official Post

    Ah, sieh mal an, wieder was gelernt.


    Ich habe mir deinen Code mal angeschaut. Zur Erstellung von eMark Adressen benötigst du die EC_KEYs für den privaten Key und den öffentlichen Key. Das sind die KeyPrefix, damit die Adresse mit N beginnt.
    Für Bitcoin sind die 0x00 und 0x80, für Litecoin 0x30 und 0xB0.
    Für die emark die kenne ich nicht. Und die Ersteller der eMark haben keinerlei Doku zu ihrem eMark-Protokoll veröffentlicht.
    Bei dir im Code steht der EC_KEY auf 0x41??? Ist das richtig?


    Kennt jemand die EC_Keys für die DEM???

  • Danke Fyuri für den denkanstoß,
    hatte gerade das gefunden
    https://bitcointalk.org/index.php?topic=376335.0
    aber leider nur für Scrypt


    Den teil hatte ich mir auch schon angeschaut, leider Fehler beim Kompilieren. Probiere es heute abend mal. Aber der ist 0x42.
    Aber das ist schon die Stelle, Adresstype wird auch übergeben an die Funktion vg_encode_adress () und an vg_encode_privkey(), denke ich muss nur die übergabe änder Probiere ich auch heute Abend. ka warum bei dem einen 0 und bei dem anderen 128 steht. mal schauen.


    Nochmal zu DEM. Der quellcode ist nicht veröffentlicht? Und wer hat dann das Wallet gemacht? Woher ist dann ein maximum an Coins festgeleg? Shade dachte das wäre alles offen und jeder kann reinschauen. Das ist definitiv nachteilig. oder ist nur keine Doku da und quellcode offen?
    mfg r37r0

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

  • Ok ich konnte es nicht lassen. Ja es sind die übergaben die geändert werden müssen.
    Hier das Ergebniss wenn ich für litecoins
    Also ist es coin unabhängig. Auch etwas dazugelernt
    addrtype = 48;
    privtype = 176;
    einsetze
    bekomme ich
    Address: LiHQbYr99e1cWZ2iMiGqvtTz974AqKnspd
    Privkey: 6vRZof2UdUX2TsbK58wChd6hpiXc1DP2QnBV9hPwJwE52YFFxsj
    was eindeutig nach einer Litecoinadresse aussieht.
    Also nur noch die richtigen Werte für die DEM und wir haben den generator^^
    und ich meine Paperwallets ^^
    und der Portierung von Bitaddress.org stehen nur noch meine beschränkten Java und Html Kentnisse im wege^^


    mfg r37r0

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

  • Habe mir das ganze mal angeschaut.
    Fazit : Bitaddress.org werde ich nicht so ohne weiteres hinbekommen.
    Dennoch habe ich etwas schönes gefunden.
    http://namecoinia.org/
    kann ich in wenigen Stunden auf DEM portieren bei passendem Key im Format 0x00 größer ist das Problem mit dem Hosting, das kann ich nicht machen.
    Unabhängig von dem "Key" werde ich die Seite umbasteln. Brauche dafür aber noch ein paar Bilder, Grafiken etc. habt ihr irgend ein ftp server wo sowas drauf ist?


    Achso habe vergessen zu fragen wer einen Account bei Bitcointalk hat, der könnte mal frage ob wir seine Seite überhaupt verwenden dürfen.^^
    Habe zwar auch einen aber irgendwie kann ich als "neuer" nichts posten kA was ich machen muss damit das geht. Sinnlose Posts machen um etwas schreiben zu dürfen finde ich auch echt besch******.


    https://bitcointalk.org/index.php?topic=426196.0
    Das ist der post mit dem ich auf die Seite gekommen bin.


    Freue mich aufs loslegen.
    mfg r37r0

    DEM: Ndepnw7b6v2N33Gx9J3QLGmYPJZfctpYtj
    BTC: 17tAWN8UwxcaZmwGfhrhsiQfCbmFA7A5PX

    Edited once, last by r37r0 ().

    • Official Post


    Nochmal zu DEM. Der quellcode ist nicht veröffentlicht? Und wer hat dann das Wallet gemacht? Woher ist dann ein maximum an Coins festgeleg? Shade dachte das wäre alles offen und jeder kann reinschauen. Das ist definitiv nachteilig. oder ist nur keine Doku da und quellcode offen?
    mfg r37r0


    Doch der Quellcode ist offen. Aber ohne Doku, was am DEM Client im Gegensatz zum Original alles verändert wurde, sucht man sich kapput.


    zu Namecoinia.org:
    Das ist auch nur ein Fork von Bitaddress.org. Ist der selbe Sourcecode abgeändert für Namecoin. Nur eben eine ältere Version. zur Lizenz:


  • ... Doch der Quellcode ist offen. ...


    Ist das wirklich so? Finde den nirgends. Auf Github gibts doch nur die Wallet, oder?
    Halte das für eine wichtige Sache. Habe keine Ahnung von so etwas, aber beim Bitcoin heißt es ja immer, wie wichtig das sei.


  • bis jetzt gibt es ja auch nur das Wallet :)
    Da ist alles drin, was ein Coin braucht um zu funktionieren.


    Wichtiger Hinweis, doch das ist mir schon klar, da habe ich mich nicht gut genug ausgedrückt.
    Unter dem Link zur Wallet - und das ist der einzige, den ich kenne - finde ich nur die Wallet, fix und fertig installierbar:
    http://sourceforge.net/project…eMarks-1.0.0.rar/download
    Einen Quellcode finde ich da nicht.
    Ich brauche den natürlich auch nicht, es läuft ja. Meine Überlegung war da nur, daß, wo es so häufig ganz grundsätzlich heißt, daß ein Coin-Projekt quelloffen sein sollte, zur Deutschen eMark auch der Quellcode offen einsehbar sein sollte. Und da finde ich halt nichts.
    Das geht vielleicht anderen auch so - und die sind deshalb von der Deutschen eMark abgeschreckt.
    Keine Ahnung; wir suchen ja im Moment nach Verbesserungsmöglichkeiten. Vielleicht ist das ja eine.