Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
26 марта 2011, 9:03:40 PM   # 1
 
 
Сообщения: 1484
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Этот патч добавляет одну форму отказа запрошенной функции, шифрование бумажника:

     http://yyz.us/bitcoin/patch.bitcoin-wallet-crypter
     или мерзавец: //github.com/jgarzik/bitcoin.git#crypter

BIG FAT ПРЕДУПРЕЖДЕНИЕЭтот патч опасно, и может создать unspendable монеты. Не следует использовать, если вы действительно не знаете, что вы делаете.

Детали реализации:

С этим изменением, шифрование (и связанная с ними ключевой фразой) в настоящее время требуются, в противном случае программа будет выходить. Пользователь может установить свою ключевую фразу в переменной окружения WALLET_PASSPHRASE, или в диалоге GUI, если GUI присутствует.

Новый тип бумажника записи, "Ekey"Используются для хранения открытого ключа + AES-зашифрованного закрытого ключа. Все новые частные ключи хранятся в "Ekey" записей. Старые ключи, хранящиеся в "ключ" а также "wkey" записи будут продолжать читать и поддерживается на неопределенный срок, но Bitcoin больше не пишет эти записи.

Предостережения:

  • Полностью тестировался черновик. Он собирает и делает логический смысл, что это о нем. Я даже не удосужился проверить это, хотя я приветствую обратную связь от смельчаков!
  • Реализация скелетная. Нет положения для восстановления бумажника, или обнаруживая использование неправильной ключевой фразы (легкий путь к коррумпированным!) и т.д.

Пусть комментарии начинаются. Надеюсь, что это вызовет обсуждение надлежащего решения для шифрования бумажника, теперь этот код там.
jgarzik сейчас офлайн Пожаловаться на jgarzik   Ответить с цитированием Мультицитирование сообщения от jgarzik Быстрый ответ на сообщение jgarzik


Как заработать Биткоины?
Без вложений. Не майнинг.


26 марта 2011, 9:18:58 PM   # 2
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Получил 1806 Биткоинов
Реальная история.





Я был на самом деле также работаю над этим с помощью SSL SEAL в:

Код:
#включают <строка>
#включают <исключение>
используя зЬй :: строку;

// ЬурейеЙ структура RSA;
#включают

Класс чтение: общественный станд :: исключение
{
общественности:
    виртуальный Const символ *, что () Const бросок ();
};

Класс NoKeypairLoaded: общественный станд :: исключение
{
общественности:
    виртуальный Const символ *, что () Const бросок ();
};

класс AccessCard
{
общественности:
    Карта доступа();
    ~ AccessCard ();
    аннулируются Сформировать ();
    аннулируются нагрузки (Const строки& PEM, Const строка& проходить);
    недействительным PublicKey (строка& PEM) Const;
    недействительным PrivateKey (строка& PEM, Const строка& ключевая фраза) сопзЬ;

    Печать недействительным (FILE * in_file, FILE * out_file);
    аннулированию Unseal (FILE * in_file, FILE * out_file);

частный:
    аннулированию CheckKey () сопзЬ;

    RSA * пара ключей;
};

класс Биобокс
{
общественности:
    структура буфера
    {
        пустота * ЬиЕ;
        INT размер;
    };

    Биобокс ();
    ~ Биобокс ();
    недействительным ConstructSink (Const строка& ул);
    аннулированию NewBuffer ();
    БИО * Био () Const;
    Буфер ReadAll ();
частный:
    BIO * био;
    Буфер ЬиЕ;
};

класс EvpBox
{
общественности:
    EvpBox (RSA * Кейп);
    ~ EvpBox ();
    EVP_PKEY * Key ();
частный:
    EVP_PKEY * evpkey;
};

// --------------------
#включают

Const символ * :: Ошибка чтения, что () Const бросок ()
{
    вернуть "Проблема чтения BIO.";
}
Const символ * NoKeypairLoaded ::, что () Const бросок ()
{
    вернуть "Нет пару ключей не загружены.";
}

AccessCard :: AccessCard ()
  : Пара ключей (NULL)
{
    если (EVP_get_cipherbyname ("AES-256-CBC") == NULL)
        OpenSSL_add_all_algorithms ();
}
AccessCard :: ~ AccessCard ()
{
    RSA_free (пара ключей);
}
аннулируются AccessCard :: CheckKey () Const
{
    если (! пара ключей)
        бросить NoKeypairLoaded ();
}

недействительный AccessCard :: Сформировать ()
{
    RSA_free (пара ключей);
    = RSA_generate_key пара ключей (2048, RSA_F4, NULL, NULL);
    Проверить ключ();
}

статический символ * LoseStringConst (Const строка& ул)
{
    вернуться const_cast<символ *>(Str.c_str ());
}
статическая сила * StringAsVoid (Const строка& ул)
{
    вернуться reinterpret_cast<недействительным *>(LoseStringConst (ул));
}

Биобокс :: Биобокс ()
 : Био (NULL)
{
    buf.buf = NULL;
    buf.size = 0;
}
Биобокс :: ~ Биобокс ()
{
    BIO_free (био);
    бесплатно (buf.buf);
}
аннулируется Биобокс :: ConstructSink (Const строки& ул)
{
    BIO_free (био);
    био = BIO_new_mem_buf (StringAsVoid (ул), -1);
    если (! био)
        бросить Ошибка чтения ();
}
аннулируются Биобокс :: NewBuffer ()
{
    BIO_free (био);
    био = BIO_new (BIO_s_mem ());
    если (! био)
        бросить Ошибка чтения ();
}
BIO * Биобокс :: Bio () Const
{
    вернуться био;
}
Биобокс :: Buffer Биобокс :: ReadAll ()
{
    buf.size = BIO_ctrl_pending (био);
    buf.buf = таНос (buf.size);
    если (BIO_read (био, buf.buf, buf.size) < 0) {
        // если (ERR_peek_error ()) {
        // ERR_reason_error_string (ERR_get_error ());
        // возвращает NULL;
        //}
        бросить Ошибка чтения ();
    }
    вернуться БУФ;
}

EvpBox :: EvpBox (RSA * Кейп)
{
    evpkey = EVP_PKEY_new ();
    если (! EVP_PKEY_set1_RSA (evpkey, Кейп)) {
        бросить Ошибка чтения ();
    }
}
EvpBox :: ~ EvpBox ()
{
    EVP_PKEY_free (evpkey);
}
EVP_PKEY * EvpBox :: Key ()
{
    вернуться evpkey;
}

Статическая INT pass_cb (символ * ЬиЕ, внутр размер, внутр rwflag, пустота * и)
{
    Const строка пас = reinterpret_cast<символ *>(И);
    INT Len = pass.size ();
    // если слишком долго, усечение
    если (LEN > размер)
        Len = размер;
    pass.copy (BUF, длина);
    вернуться Len;
}
аннулируется AccessCard :: Load (Const строки& PEM, Const строка& проходить)
{
    RSA_free (пара ключей);
    Биобокс био;
    bio.ConstructSink (PEM);
    = PEM_read_bio_RSAPrivateKey пара ключей (bio.Bio (), NULL, pass_cb,
                                         StringAsVoid (проход));
    Проверить ключ();                    
}
аннулируются AccessCard :: PublicKey (строка& PEM) сопзЬ
{
    Проверить ключ();
    Биобокс био;
    bio.NewBuffer ();
    INT RET = PEM_write_bio_RSA_PUBKEY (bio.Bio (), пара ключей);
    если (! RET)
        бросить Ошибка чтения ();
    Const Биобокс :: Buffer& ЬиЕ = bio.ReadAll ();
    PEM = строка (reinterpret_cast(Buf.buf), buf.size);
}

аннулируются AccessCard :: PrivateKey (строка& PEM, Const строка& ключевая фраза) сопзЬ
{
    Проверить ключ();
    Биобокс био;
    bio.NewBuffer ();

    EvpBox ЦПС (пара ключей);
    INT RET = PEM_write_bio_PKCS8PrivateKey (bio.Bio (), evp.Key (),
                                            EVP_aes_256_cbc (),
                                            LoseStringConst (ключевая фраза),
                                            passphrase.size (), NULL, NULL);
    если (! RET)
        бросить Ошибка чтения ();
    Const Биобокс :: Buffer& ЬиЕ = bio.ReadAll ();
    PEM = строка (reinterpret_cast(Buf.buf), buf.size);
}

#включают
#включают

#включают
#включают
#включают
#включают

#включают <арпа / inet.h> / * Для Htonl () * /

аннулируются AccessCard :: Печать (FILE * in_file, FILE * out_file)
{
    Проверить ключ();
    // Смотри ниже
}
аннулируются AccessCard :: Unseal (FILE * in_file, FILE * out_file)
{
    Проверить ключ();
}

// ------------------------------------------------ -------------------
// это обыкновение быть в конечном файле ... это наш блок тест
// ------------------------------------------------ -------------------
#включают
#включают
используя зЬй :: COUT;

Int основных ()
{
    AccessCard согл;                                                    
    // Новый ключ
    acc.Generate ();
    строка PEM;
    //acc.PublicKey(pem);
    // соиЬ << PEM << "\ п";
    acc.PrivateKey (PEM, "Здравствуйте");
    // соиЬ << PEM << "\ п";
    //// ----------------
    acc.Load (PEM, "Здравствуйте");
    acc.PublicKey (PEM);
    // соиЬ << PEM << "\ п";
    //acc.Seal(stdin, стандартный вывод);
    возвращать 0;
}
 

Код:
#включают
#включают
#включают

#включают
#включают
#включают
#включают

#включают <арпа / inet.h> / * Для Htonl () * /

// ключ RSA должен быть 2048 бит с показателем 65537
символ * PUBLIC_KEY_PEM =
"----- НАЧАТЬ PUBLIC KEY ----- \ п"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwu4ymKmuXoSvZn + TLOIh \ п"
"SXq7w + P1OeM9LCDt7ZpR / krdMyW6UZBnZCNnB / 1KWg + 3dtO07ScSBgE0U / EMNvHB \ п"
"Im / tvzhomZgMGtL0Ln + Lbh7UkdWqlBHgxgHzG6UX + Kr / Ja + W1wR5mHIPZVBpx1Lq \ п"
"ctSVf3EQhAHajyI3V + 6JFDcdjzRPX9z5C / MCuHHhBhtjKfIE89dhZSyDvIFP / YFy \ п"
"ч / EeK7GiDcOrx + 7hRZ6yfeD71xpK4lJ6GYw516 + FaL1Yjdf / kRToDDziz00ZNEjg \ п"
"gs7ps2D / 8SKmUcsWRldbxm3 + yKJPwUAv4jNAY / Aod7cs1q7f2YuPQC0WjriBR1s8 \ п"
"GwIDAQAB \ п"
"----- END PUBLIC KEY ----- \ п";

символ * PRIVATE_KEY_PEM =
"----- НАЧАТЬ зашифрованное Частное КЛЮЧА ----- \ п"
"MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIa4XBjpJFZtQCAggA \ п"
"MB0GCWCGSAFlAwQBKgQQ / dTrBC83CJnHfwgM6rotAwSCBNCvGXvzLgNkWT3Kvwui \ п"
"Ln7gfiGtOfaubw5oq8DVh51hMhyYKnS8wAjMEkB0heFwTLLy1PCZnGv916NcUWhu \ п"
"b4OxwCb / F3viBRSRgNaq5GB / c1HNeeg8CtEHs / EkxdIJuJuNr / giQp // TZ7Gm6Xf \ п"
"Zb2rrdbW8ivxnactmJHdy5aRWA6Bhf5qr + 0MjrTrUWKORUUIRLzJzGJ481Y0WIA6 \ п"
"9iK7I6aQnr5KzTETTUcMj + цу + WvlW3Ly3kn5ZGds / yB0wHnLTvCOBnIv9mq2nmZ3 \ п"
"Pyfm + WJirMwXkcZF + 7U3Hsbk3Uk6VJqR / G0gKSiBebCgypYe6w5JTJQAoWdy96Zc \ п"
"QHwr47dXIuhMzusdx9D67xz2HR0InGTnSTUOxCfYFDQaWdVUh2lHDswWqi6ZlFLJ \ п"
"POkh24yaxE2S7Yn / CKAnET961GLAvVXChecjF2XkOoOGxE2rmOkrpc6fjndVTz5J \ п"
"B4Vj0d3jotuHG + a6kbksV + 71JbpJr5F69VRjsWpiEOwunHmtTdGhOmBkcyqJHXBh \ п"
"8kusMSbZUzJTPFuTMJmxxzExasmif2CbJBl4WyfvKQjKlXyJSkysJN2V2NrA5Vpc \ п"
"eb9msgXX8vBaN40ahT5mDeG5TXDPdssYOnQTM4vJo6IkSS2DIbMcUgbTcj9Qf3WZ \ п"
"Y + FPROyIu8aKmCqDnDqJFp7aYaqjw5BWm6gL9YroPvNB8Funs8O1IgksMIUC + MT8 \ п"
"kFmq / Z9eUeoRawg4MGcMrgTdPDlrDB7uWfY2tPG / kkHQWEQyv13jJ1uEjUKf6wYk \ п"
"WmIY5tvPEX3y4smscdWZGDQEjWL7zLs + 7oLOwru2TbYmCx + V2QJpIW6Ppql / HCYr \ п"
"+ FJ + 3qZ + I + eVcAW52jY8ygesab / + bQOrgpEfmBpTglTd + tt6h + 16INagI4W + cY0z \ п"
"iRcQjerjsgHM6JP4o4ZgxHBryHr5HdaZtpNXf3sHnaSwDCM / kVaeHAg + ciduRg + О \ п"
"S6TIfdk334IFg7wXHRjjZXDX1QzRpUSBWvG4IdgE5Z9 / 3B0tvDbcU + R6c4GCTsiH \ п"
"GZ / BWBQKaS3HhxhaUIlZhXXVgFvmGP5DsdaDQZG2VAsZqsTISrEG8OnHaklZIqi6 \ п"
"/ GcMHJ2bHGmBKMgj0cTtkE53h1UZzlDkYqnf8b50uYunvDTNne / LPsPbfeuxTxDL \ п"
"Oe5LtSD36vhSaExmaOkSN0qTY83zTDvxbSe7GBf87TNRimfnXZtxpghpgDffXgVi \ п"
"j5JUcDjXpSC4xeu8jbq / lzh6x4o4nJRloPye8Zmq5VP7heZRN07GHDY6r1Jzz / 4с \ п"
"mBJWfMEg / OqB8CrOJibi6IPN3VkKzcF2WSWG712RizNHkWwaamlesC0dluXDmudj \ п"
"bKr1niEF7KinUYiDu7ZJAntMRSm0hzjilAabSBXYP1RFOsZfgUfltON0oC2Zj5iX \ п"
"wPaBUYhx2Fwn9jsge4NBWn3OXnqzZaq1Ojl0qb3YRbi2FVkisyZV / Dqzj1uGYkRq \ п"
"6n6yoPqfAk / + u69Hzp1hHQi2wYbHbIDuQEI / kKRZ / XBxoL6c9LvYyKXKgBqd8RVU \ п"
"Т + AmBDkjEtksjQYaicwxe3MEcrM1PcEDyxJwRDsWp8Lo8wOU30A6ESlZb2TH / GGV \ п"
"OxKP46YqccVN57 + pU8RZ6bi0jg == \ п"
"----- END ENCRYPTED PRIVATE KEY ----- \ п";

символ * PRIVATE_KEY_PEM_TWO =
"----- НАЧАТЬ RSA PRIVATE KEY ----- \ п"
"MIIEowIBAAKCAQEAwu4ymKmuXoSvZn + TLOIhSXq7w + P1OeM9LCDt7ZpR / krdMyW6 \ п"
"UZBnZCNnB / 1KWg + 3dtO07ScSBgE0U / EMNvHBIm / tvzhomZgMGtL0Ln + Lbh7UkdWq \ п"
"lBHgxgHzG6UX + Kr / Ja + W1wR5mHIPZVBpx1LqctSVf3EQhAHajyI3V + 6JFDcdjzRP \ п"
"X9z5C / MCuHHhBhtjKfIE89dhZSyDvIFP / YFyh / EeK7GiDcOrx + 7hRZ6yfeD71xpK \ п"
"4lJ6GYw516 + FaL1Yjdf / kRToDDziz00ZNEjggs7ps2D / 8SKmUcsWRldbxm3 + yKJP \ п"
"wUAv4jNAY / Aod7cs1q7f2YuPQC0WjriBR1s8GwIDAQABAoIBACNlFRLbXKoU9bRq \ п"
"3dJ8jQbGnmmHbvO / 60 + J + W / 1wYWnGls7MoW07tEkDIVK3MFVsT6GWoflXERy24mS \ п"
"b2FarHMQV98s4vFgxnHodCYtSqgIORjx7zNLu8C4geg3Jg8lHZnVCtKoIVwo + dqv \ п"
"q0ViLOgE6dBmO1V88K6ky9 / PlFxzBA7ER / XLqbkdmgDC + XLGQ63s31FXeKla9rQg \ п"
"XodPx9AYUYuTLXOlNT1KXCa9a53qgB2woTGdtc1fPkBpnd + SHd2MItR + 35X2ZXnY \ п"
"b3kzOj + 62O5MmC + sNysNy5D6Aut1fsEzauJr4jGP8TtpvC4Qc3 / vLt2l7g / WHAzp \ п"
"0TPiMGECgYEA9fHMBVIkTUzpKnzoF3jhqNFoqJqXgul32e7ej8Ov5b06wId1WLA / \ п"
"/ ZmgucPLAL1DDVyJMotNqeQPWt3x9 ++ nTpnDHavGQ96y7SEI2zHuLMuhoR9c1zfA \ п"
"MQicGfk25dhXWtMxFilFAkBbwCcLEq1XHcMI6ek4zKYlJ8tCHC4BmtcCgYEAyuZ0 \ п"
"91CBLcBuBrwpnxdXtOurwRDoOgXpJxy8bD9ctltcPFeilBUWuLYZ + gyBozli23Uh \ п"
"KuDlKMZJw + CHztiEJwuzzzWOOxejs2qtBfSHM7Hne37Qpb / qcVfgn5C6fj7LeIgG \ п"
"hUdK2QN2jEx + AWahFFFJ6Z2cmQBXXBGOW4LGZF0CgYA9 + / ukV6hohvq4x5Qi3kdZ \ п"
"KbXL0HJg / wBCv639457AMunMvhb4DCuEeaSFTPArtodgpbK6N1uSdrTb / NXP2 + l5 \ п"
"qM0A / FrSnhzQIKQ / why503RfzCy03QsmEHpvHV0VnmmdrV5QrIQE5j15dx2WTnOH \ п"
"P7FOaoXzJeh1WAfIXFvxLwKBgQC2XvIfIVMa5m1 + zD2062xAB9w3CpVRIeLw7tlF \ п"
"iqYwmmmLK1HMPDBSEgvDPt5 + 8aOzkdIgEkinn6LJ1tT6zI3r8o7J3l9bKeJP78BZ \ п"
"К / MiOfPQgqnTcW6uNciGY7Xcp2CHk + wYe34BFSXG8TII3FBITNBclPgeZbof3P / Р \ п"
"rPfZWQKBgEbk1OsuDxUbcfgeMT0f1cBiJxtkRsj3Kffm6c2PAzGZg8A / EgoR25Cr \ п"
"v + u4s5aS / 3cBAfJhu9OAqoXdYJlXfYsoKuyOyvzeyOcsAsKjd6tIiU6xUe / u65oZ \ п"
"1KXWzXoYgnNW3eoU7YeQ0Ca4SSg3qG2jqGFIAClla + hyLUeEgXB1 \ п"
"----- END RSA PRIVATE KEY ----- \ п";

Статическая INT pass_cb (символ * ЬиЕ, внутр размер, внутр rwflag, пустота * и)
{
    Int LEN = STRLEN ("Здравствуйте");
    // если слишком долго, усечение
    если (LEN > размер)
        Len = размер;
    strncpy (ЬиЕ, "Здравствуйте", Длина);
    вернуться Len;
}

INT do_evp_seal (FILE * in_file, FILE * out_file)
{
    INT RetVal = 0;
    RSA * rsa_pkey = NULL;
    EVP_PKEY * PKey = EVP_PKEY_new ();
    EVP_CIPHER_CTX CTX;
    неподписанный символ буфер [4096];
    символ без знака buffer_out [4096 + EVP_MAX_IV_LENGTH];
    size_t Len;
    INT len_out;
    неподписанные символ * ки;
    Int eklen;
    uint32_t eklen_n;
    символ без знака IV [EVP_MAX_IV_LENGTH];

    OpenSSL_add_all_algorithms ();
    БИО * PBIO = BIO_new_mem_buf (reinterpret_cast<недействительным *>(PRIVATE_KEY_PEM), -1);
    // BIO * PBIO = BIO_new_mem_buf (reinterpret_cast<недействительным *>(PUBLIC_KEY_PEM), -1);
    // если (! PEM_read_bio_RSA_PUBKEY (PBIO, &rsa_pkey, NULL, NULL))
    если (! PEM_read_bio_RSAPrivateKey (PBIO, &rsa_pkey, pass_cb, NULL))
    // если (! PEM_read_bio_RSAPrivateKey (PBIO, &rsa_pkey, NULL, NULL))
    {
        fprintf (STDERR, "Ошибка при загрузке RSA Public Key File. \ п");
        ERR_print_errors_fp (STDERR);
        RetVal = 2;
        Гото вне;
    }

    если (! EVP_PKEY_assign_RSA (PKey, rsa_pkey))
    {
        fprintf (STDERR, "EVP_PKEY_assign_RSA: не удалось \ п.");
        RetVal = 3;
        Гото вне;
    }

    EVP_CIPHER_CTX_init (&CTX);
    ек = reinterpret_cast<неподписанные символ *>(ТаНос (EVP_PKEY_size (PKey)));

    если (! EVP_SealInit (&CTX, EVP_aes_256_cbc (), &ек, &eklen, внутривенно, &PKey, 1))
    {
        fprintf (STDERR, "EVP_SealInit:. Не удалось \ п");
        RetVal = 3;
        Гото out_free;
    }

    / * Сначала выпишем зашифрованную длину ключа, то зашифрованный ключ,
     * То IV (длина IV фиксируется шифром мы выбрали).
     * /

    eklen_n = Htonl (eklen);
    если (FWRITE (&eklen_n, SizeOf eklen_n, 1, out_file)! = 1)
    {
        PError ("выходной файл");
        RetVal = 5;
        Гото out_free;
    }
    если (FWRITE (ек, eklen, 1, out_file)! = 1)
    {
        PError ("выходной файл");
        RetVal = 5;
        Гото out_free;
    }
    если (FWRITE (IV, EVP_CIPHER_iv_length (EVP_aes_256_cbc ()), 1, out_file)! = 1)
    {
        PError ("выходной файл");
        RetVal = 5;
        Гото out_free;
    }

    / * Теперь мы обрабатываем входной файл и записывать зашифрованные данные к
     * выходной файл. * /

    в то время как ((Len = Fread (буфер, 1, SizeOf буфера, in_file)) > 0)
    {
        если (! EVP_SealUpdate (&CTX, buffer_out, &len_out, буфер, длина))
        {
            fprintf (STDERR, "EVP_SealUpdate: не удалось \ п.");
            RetVal = 3;
            Гото out_free;
        }

        если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
        {
            PError ("выходной файл");
            RetVal = 5;
            Гото out_free;
        }
    }

    если (FERROR (in_file))
    {
        PError ("входной файл");
        RetVal = 4;
        Гото out_free;
    }

    если (! EVP_SealFinal (&CTX, buffer_out, &len_out))
    {
        fprintf (STDERR, "EVP_SealFinal: не удалось \ п.");
        RetVal = 3;
        Гото out_free;
    }

    если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
    {
        PError ("выходной файл");
        RetVal = 5;
        Гото out_free;
    }

    out_free:
    EVP_PKEY_free (PKey);
    бесплатно (ек);

    вне:
    вернуться RetVal;
}

Int основных ()
{
    вернуть do_evp_seal (STDIN, STDOUT);
}


Код:
#включают
#включают

#включают
#включают
#включают
#включают

#включают <арпа / inet.h>

символ * PUBLIC_KEY_PEM =
"----- НАЧАТЬ PUBLIC KEY ----- \ п"
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvdbGZes3N / v3EqbbwYHW4rr4W \ п"
"gav9eD36kVD7Hn5LIKwhfAqd1 + LSN2YC49IsIhzwbXqoMUN89UZmFEdY4 / M4qW1 + \ п"
"qwOfaX80EKCl8zV5Ztp8fvoErS1Z / G0k0c0kRdP0BCZTI9nSfjZkhbqWKnJrtCgi \ п"
"s6OXXTeanU9B9Bz3HQIDAQAB \ п"
"----- END PUBLIC KEY ----- \ п";

символ * PRIVATE_KEY_PEM =
"----- НАЧАТЬ зашифрованное Частное КЛЮЧА ----- \ п"
"MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIa4XBjpJFZtQCAggA \ п"
"MB0GCWCGSAFlAwQBKgQQ / dTrBC83CJnHfwgM6rotAwSCBNCvGXvzLgNkWT3Kvwui \ п"
"Ln7gfiGtOfaubw5oq8DVh51hMhyYKnS8wAjMEkB0heFwTLLy1PCZnGv916NcUWhu \ п"
"b4OxwCb / F3viBRSRgNaq5GB / c1HNeeg8CtEHs / EkxdIJuJuNr / giQp // TZ7Gm6Xf \ п"
"Zb2rrdbW8ivxnactmJHdy5aRWA6Bhf5qr + 0MjrTrUWKORUUIRLzJzGJ481Y0WIA6 \ п"
"9iK7I6aQnr5KzTETTUcMj + цу + WvlW3Ly3kn5ZGds / yB0wHnLTvCOBnIv9mq2nmZ3 \ п"
"Pyfm + WJirMwXkcZF + 7U3Hsbk3Uk6VJqR / G0gKSiBebCgypYe6w5JTJQAoWdy96Zc \ п"
"QHwr47dXIuhMzusdx9D67xz2HR0InGTnSTUOxCfYFDQaWdVUh2lHDswWqi6ZlFLJ \ п"
"POkh24yaxE2S7Yn / CKAnET961GLAvVXChecjF2XkOoOGxE2rmOkrpc6fjndVTz5J \ п"
"B4Vj0d3jotuHG + a6kbksV + 71JbpJr5F69VRjsWpiEOwunHmtTdGhOmBkcyqJHXBh \ п"
"8kusMSbZUzJTPFuTMJmxxzExasmif2CbJBl4WyfvKQjKlXyJSkysJN2V2NrA5Vpc \ п"
"eb9msgXX8vBaN40ahT5mDeG5TXDPdssYOnQTM4vJo6IkSS2DIbMcUgbTcj9Qf3WZ \ п"
"Y + FPROyIu8aKmCqDnDqJFp7aYaqjw5BWm6gL9YroPvNB8Funs8O1IgksMIUC + MT8 \ п"
"kFmq / Z9eUeoRawg4MGcMrgTdPDlrDB7uWfY2tPG / kkHQWEQyv13jJ1uEjUKf6wYk \ п"
"WmIY5tvPEX3y4smscdWZGDQEjWL7zLs + 7oLOwru2TbYmCx + V2QJpIW6Ppql / HCYr \ п"
"+ FJ + 3qZ + I + eVcAW52jY8ygesab / + bQOrgpEfmBpTglTd + tt6h + 16INagI4W + cY0z \ п"
"iRcQjerjsgHM6JP4o4ZgxHBryHr5HdaZtpNXf3sHnaSwDCM / kVaeHAg + ciduRg + О \ п"
"S6TIfdk334IFg7wXHRjjZXDX1QzRpUSBWvG4IdgE5Z9 / 3B0tvDbcU + R6c4GCTsiH \ п"
"GZ / BWBQKaS3HhxhaUIlZhXXVgFvmGP5DsdaDQZG2VAsZqsTISrEG8OnHaklZIqi6 \ п"
"/ GcMHJ2bHGmBKMgj0cTtkE53h1UZzlDkYqnf8b50uYunvDTNne / LPsPbfeuxTxDL \ п"
"Oe5LtSD36vhSaExmaOkSN0qTY83zTDvxbSe7GBf87TNRimfnXZtxpghpgDffXgVi \ п"
"j5JUcDjXpSC4xeu8jbq / lzh6x4o4nJRloPye8Zmq5VP7heZRN07GHDY6r1Jzz / 4с \ п"
"mBJWfMEg / OqB8CrOJibi6IPN3VkKzcF2WSWG712RizNHkWwaamlesC0dluXDmudj \ п"
"bKr1niEF7KinUYiDu7ZJAntMRSm0hzjilAabSBXYP1RFOsZfgUfltON0oC2Zj5iX \ п"
"wPaBUYhx2Fwn9jsge4NBWn3OXnqzZaq1Ojl0qb3YRbi2FVkisyZV / Dqzj1uGYkRq \ п"
"6n6yoPqfAk / + u69Hzp1hHQi2wYbHbIDuQEI / kKRZ / XBxoL6c9LvYyKXKgBqd8RVU \ п"
"Т + AmBDkjEtksjQYaicwxe3MEcrM1PcEDyxJwRDsWp8Lo8wOU30A6ESlZb2TH / GGV \ п"
"OxKP46YqccVN57 + pU8RZ6bi0jg == \ п"
"----- END ENCRYPTED PRIVATE KEY ----- \ п";

символ * PRIVATE_KEY_PEM_TWO =
"----- НАЧАТЬ RSA PRIVATE KEY ----- \ п"
"MIIEowIBAAKCAQEAwu4ymKmuXoSvZn + TLOIhSXq7w + P1OeM9LCDt7ZpR / krdMyW6 \ п"
"UZBnZCNnB / 1KWg + 3dtO07ScSBgE0U / EMNvHBIm / tvzhomZgMGtL0Ln + Lbh7UkdWq \ п"
"lBHgxgHzG6UX + Kr / Ja + W1wR5mHIPZVBpx1LqctSVf3EQhAHajyI3V + 6JFDcdjzRP \ п"
"X9z5C / MCuHHhBhtjKfIE89dhZSyDvIFP / YFyh / EeK7GiDcOrx + 7hRZ6yfeD71xpK \ п"
"4lJ6GYw516 + FaL1Yjdf / kRToDDziz00ZNEjggs7ps2D / 8SKmUcsWRldbxm3 + yKJP \ п"
"wUAv4jNAY / Aod7cs1q7f2YuPQC0WjriBR1s8GwIDAQABAoIBACNlFRLbXKoU9bRq \ п"
"3dJ8jQbGnmmHbvO / 60 + J + W / 1wYWnGls7MoW07tEkDIVK3MFVsT6GWoflXERy24mS \ п"
"b2FarHMQV98s4vFgxnHodCYtSqgIORjx7zNLu8C4geg3Jg8lHZnVCtKoIVwo + dqv \ п"
"q0ViLOgE6dBmO1V88K6ky9 / PlFxzBA7ER / XLqbkdmgDC + XLGQ63s31FXeKla9rQg \ п"
"XodPx9AYUYuTLXOlNT1KXCa9a53qgB2woTGdtc1fPkBpnd + SHd2MItR + 35X2ZXnY \ п"
"b3kzOj + 62O5MmC + sNysNy5D6Aut1fsEzauJr4jGP8TtpvC4Qc3 / vLt2l7g / WHAzp \ п"
"0TPiMGECgYEA9fHMBVIkTUzpKnzoF3jhqNFoqJqXgul32e7ej8Ov5b06wId1WLA / \ п"
"/ ZmgucPLAL1DDVyJMotNqeQPWt3x9 ++ nTpnDHavGQ96y7SEI2zHuLMuhoR9c1zfA \ п"
"MQicGfk25dhXWtMxFilFAkBbwCcLEq1XHcMI6ek4zKYlJ8tCHC4BmtcCgYEAyuZ0 \ п"
"91CBLcBuBrwpnxdXtOurwRDoOgXpJxy8bD9ctltcPFeilBUWuLYZ + gyBozli23Uh \ п"
"KuDlKMZJw + CHztiEJwuzzzWOOxejs2qtBfSHM7Hne37Qpb / qcVfgn5C6fj7LeIgG \ п"
"hUdK2QN2jEx + AWahFFFJ6Z2cmQBXXBGOW4LGZF0CgYA9 + / ukV6hohvq4x5Qi3kdZ \ п"
"KbXL0HJg / wBCv639457AMunMvhb4DCuEeaSFTPArtodgpbK6N1uSdrTb / NXP2 + l5 \ п"
"qM0A / FrSnhzQIKQ / why503RfzCy03QsmEHpvHV0VnmmdrV5QrIQE5j15dx2WTnOH \ п"
"P7FOaoXzJeh1WAfIXFvxLwKBgQC2XvIfIVMa5m1 + zD2062xAB9w3CpVRIeLw7tlF \ п"
"iqYwmmmLK1HMPDBSEgvDPt5 + 8aOzkdIgEkinn6LJ1tT6zI3r8o7J3l9bKeJP78BZ \ п"
"К / MiOfPQgqnTcW6uNciGY7Xcp2CHk + wYe34BFSXG8TII3FBITNBclPgeZbof3P / Р \ п"
"rPfZWQKBgEbk1OsuDxUbcfgeMT0f1cBiJxtkRsj3Kffm6c2PAzGZg8A / EgoR25Cr \ п"
"v + u4s5aS / 3cBAfJhu9OAqoXdYJlXfYsoKuyOyvzeyOcsAsKjd6tIiU6xUe / u65oZ \ п"
"1KXWzXoYgnNW3eoU7YeQ0Ca4SSg3qG2jqGFIAClla + hyLUeEgXB1 \ п"
"----- END RSA PRIVATE KEY ----- \ п";

INT do_evp_seal (FILE * in_file, FILE * out_file)
{
    INT RetVal = 0;
    RSA * rsa_pkey = NULL;
    EVP_PKEY * PKey = EVP_PKEY_new ();
    EVP_CIPHER_CTX CTX;
    неподписанный символ буфер [4096];
    символ без знака buffer_out [4096 + EVP_MAX_IV_LENGTH];
    size_t Len;
    INT len_out;
    неподписанные символ * ки;
    Int eklen;
    uint32_t eklen_n;
    символ без знака IV [EVP_MAX_IV_LENGTH];

    OpenSSL_add_all_algorithms ();
    БИО * PBIO = BIO_new_mem_buf (reinterpret_cast<недействительным *>(PRIVATE_KEY_PEM), -1);
    если (! PEM_read_bio_RSAPrivateKey (PBIO, &rsa_pkey, NULL, NULL))
    {
        fprintf (STDERR, "Ошибка при загрузке RSA Public Key File. \ п");
        ERR_print_errors_fp (STDERR);
        RetVal = 2;
        Гото вне;
    }

    если (! EVP_PKEY_assign_RSA (PKey, rsa_pkey))
    {
        fprintf (STDERR, "EVP_PKEY_assign_RSA: не удалось \ п.");
        RetVal = 3;
        Гото вне;
    }

    / * Сначала выпишем зашифрованную длину ключа, то зашифрованный ключ,
     * То IV (длина IV фиксируется шифром мы выбрали).
     * /

    если (Fread (&eklen_n, SizeOf eklen_n, 1, in_file)! = 1)
    {
        PError ("входной файл");
        RetVal = 5;
        Гото out_free;
    }
    eklen = ntohl (eklen_n);
    // eklen = 128;
    // ек = reinterpret_cast<неподписанные символ *>(ТаНос (EVP_PKEY_size (PKey)));
    // ек = reinterpret_cast<неподписанные символ *>(ТаНос (eklen));
    ек = новый символ без знака [eklen];
    если (Fread (ек, eklen, 1, in_file)! = 1)
    {
        PError ("входной файл");
        RetVal = 5;
        Гото out_free;
    }
    если (Fread (IV, EVP_CIPHER_iv_length (EVP_aes_256_cbc ()), 1, in_file)! = 1)
    {
        PError ("входной файл");
        RetVal = 5;
        Гото out_free;
    }

    EVP_CIPHER_CTX_init (&CTX);

    если (! EVP_OpenInit (&CTX, EVP_aes_256_cbc (), ек, eklen, внутривенно, PKey))
    {
        fprintf (STDERR, "EVP_OpenInit:. Не удалось \ п");
        RetVal = 3;
        Гото out_free;
    }
    Е ("% D \ п", Eklen);

    / * Теперь мы обрабатываем входной файл и записывать зашифрованные данные к
     * выходной файл. * /

    в то время как ((Len = Fread (буфер, 1, SizeOf буфера, in_file)) > 0)
    {
        если (! EVP_OpenUpdate (&CTX, buffer_out, &len_out, буфер, длина))
        {
            fprintf (STDERR, "EVP_OpenUpdate: не удалось \ п.");
            RetVal = 3;
            Гото out_free;
        }

        если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
        {
            PError ("выходной файл");
            RetVal = 5;
            Гото out_free;
        }
    }

    если (FERROR (in_file))
    {
        PError ("входной файл");
        RetVal = 4;
        Гото out_free;
    }

    если (! EVP_OpenFinal (&CTX, buffer_out, &len_out))
    {
        fprintf (STDERR, "EVP_OpenFinal: не удалось \ п.");
        RetVal = 3;
        Гото out_free;
    }

    если (FWRITE (buffer_out, len_out, 1, out_file)! = 1)
    {
        PError ("выходной файл");
        RetVal = 5;
        Гото out_free;
    }

    out_free:
    EVP_PKEY_free (PKey);
    бесплатно (ек);

    вне:
    вернуться RetVal;
}

ИНТ основной (интермедиат ARGC, символ * ARGV [])
{
    вернуть do_evp_seal (STDIN, STDOUT);
}



Не уверен, что если код полезен сейчас, но в любом случае демпинг его ...

г ++ a.cpp -lssl -o enctest
./ enctest
г ++ b.cpp -lssl -o уплотнение
./печать < ВХОД > ENCOUT
г ++ c.cpp -lssl -o распечатывания
./ распечатывания < ENCOUT
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

26 марта 2011, 9:48:51 PM   # 3
 
 
Сообщения: 1484
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Не уверен, что если код полезен сейчас, но в любом случае демпинг его ...

Там было много функции-запроса и записи демо и тому подобное. Размещая реальный код против текущего Bitcoin, была надежда, что мы могли бы перейти к более целенаправленному обсуждению (ж / реальный код) о том, что шифрование кошелька должно выглядеть.

Мы должны ответить на такие вопросы, как

Является ли данный способ криптостойким?
Если мы зашифровать весь кошелек, а не только частные ключи?
Должны ли мы зашифровать данные открытого текста объединяется вместе, как единый огромный буфер памяти, увеличивая блок шифрования цепочки, или зашифровать invididual записи как мой патч делает?
Как обрабатывать обновления бумажника + даунгрейд?  "Ekey" создает unspendable монеты, при переходе к более старым клиентам.
Как проверить на наличие недействительных ключевую фразу? Кажется, криптографический неразумно использовать наивную реализацию (шифровать статическую, хорошо известную строку, проверить на наличии недействительной ключевой фразы, пытаясь расшифровать хорошо известный открытый текст).

jgarzik сейчас офлайн Пожаловаться на jgarzik   Ответить с цитированием Мультицитирование сообщения от jgarzik Быстрый ответ на сообщение jgarzik

26 марта 2011, 10:00:36 PM   # 4
 
 
Сообщения: 1372
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Если мы зашифровать весь кошелек, а не только частные ключи?

Я не проголосовал бы нет - шифровать закрытые ключи только - в противном случае ключевая фраза должна быть типизированных чаще, что делает его более уязвимым к перехвату.

Должны ли мы зашифровать данные открытого текста объединяется вместе, как единый огромный буфер памяти, увеличивая блок шифрования цепочки, или зашифровать invididual записи как мой патч делает?

Если каждая запись была зашифрована с должным криптографически случайным вектором инициализации два должны быть эквивалентны. С другой стороны, шифрование всего как блок гарантирует, что нет никакой возможности различных записей шифруются с разными ключами для какой-либо причины.

Как проверить на наличие недействительных ключевую фразу? Кажется, криптографический неразумно использовать наивную реализацию (шифровать статическую, хорошо известную строку, проверить на наличии недействительной ключевой фразы, пытаясь расшифровать хорошо известный открытый текст).

Если предположить, что политика не "шифровать все", Не было бы простым и понятным, чтобы соотнести закрытый ключ либо открытым ключом, или адрес Bitcoin? Кажется, она либо проверить бы вне или не будет. Если политики были шифровать все, просто хранить, возможно, последние 16 битого хэша (пароль + соль), где эта соль используется только для восстановления пароля проверки хэша, так что 16 бит действительного ключа не были даны прочь, вы бы метод, который ловит почти все опечатки, не будучи очень полезными для взломщика паролей.

casascius сейчас офлайн Пожаловаться на casascius   Ответить с цитированием Мультицитирование сообщения от casascius Быстрый ответ на сообщение casascius

27 марта 2011, 1:07:12 AM   # 5
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Является ли данный способ криптостойким?
SSL рекомендует использовать SEAL, который делает RSA + AES с капельницей (как описано выше). Вы не должны использовать постоянные капельницы, так как это может привести к статистической атаке.

котировка
Если мы зашифровать весь кошелек, а не только частные ключи?
Весь кошелек. Расшифровать в память один раз при запуске. Рандомизации расположения в памяти как-то.

котировка
Как проверить на наличие недействительных ключевую фразу? Кажется, криптографический неразумно использовать наивную реализацию (шифровать статическую, хорошо известную строку, проверить на наличии недействительной ключевой фразы, пытаясь расшифровать хорошо известный открытый текст).

Выше код, который я написал, будет пытаться загрузить PEM, но бросить исключение, когда используется недопустимый ключевая фраза. Таким образом, код так просто, как:

пытаться {
  // загружаем
} Задвижка (ERR Ошибка чтения) {
}
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

27 марта 2011, 1:08:37 AM   # 6
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Это очень краткое осуществление. Я сделал пятно одна ошибка:

Код:
+    вектор<неподписанные символ> Encrypt (вектор<неподписанные символ> vchPlaintext)
+    {
+      // макс шифротекста LEN для п байт открытого текста является
+      // п + AES_BLOCK_SIZE - 1 байт
+      INT Len = vchPlaintext.size ();
+      INT c_len = Len + AES_BLOCK_SIZE, f_len = 0;
+      вектор<неподписанные символ> vchCiphertext (c_len);
Максимальный размер шифротекста фактически LEN + 2 * AES_BLOCK_SIZE, так что вы должны установить c_len к этому, и выделить что много места.

Кроме того, недостаток безопасности, вы используете постоянный IV везде, похоже. Вы должны использовать различный IV для каждого шифрования.

Еще один момент, Bitcoin использует тип CPrivKey для конфиденциальных данных, таких как частные ключи. Это обнулит память, когда он освобожден.
Hal сейчас офлайн Пожаловаться на Hal   Ответить с цитированием Мультицитирование сообщения от Hal Быстрый ответ на сообщение Hal

27 марта 2011, 8:42:35 PM   # 7
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Там хорошо обсуждение этой функции здесь:

https://github.com/bitcoin/bitcoin/issues#issue/3

https://gist.github.com/803170

Вопросы:

 - Симметричный (ЭОС) против открытого ключа (RSA) шифрования

 - Расшифровать при запуске против дешифрования по использованию

 - Создание новых ключей автоматически (как сейчас) против создать только на действия пользователя

 - Шифровать все ключи с тем же кодовой фразой против различных фраз для различных наборов ключей

Один из способов их анализа осуществляется с помощью модели угроз. Что может сделать злоумышленник, который мы будем стараться, чтобы защититься от? И что мы не защищаться?

Можно выделить три уровня атакующего:

1. Можно читать файлы пользователя

2. Можно читать пользовательские файлы / записи, но только для чтения системных файлов

3. Можно ли читать / писать все, привилегии суперпользователя


К сожалению, устают, будет писать позже.",
Hal сейчас офлайн Пожаловаться на Hal   Ответить с цитированием Мультицитирование сообщения от Hal Быстрый ответ на сообщение Hal

28 марта 2011, 5:30:55 AM   # 8
 
 
Сообщений: 26
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Вопросы:

 - Симметричный (ЭОС) против открытого ключа (RSA) шифрования

 - Расшифровать при запуске против дешифрования по использованию

 - Создание новых ключей автоматически (как сейчас) против создать только на действия пользователя

 - Шифровать все ключи с тем же кодовой фразой против различных фраз для различных наборов ключей

Гибкая система может выполнить следующие действия с пользователем сделать какой-то выбор юзабилити:

* Попросите пользователя выбрать фразу и получить один или два секретных ключей или пользователь выбирает две ключевые фразы
* По желанию шифрования бумажник в целом с одним секретным ключом
* Всегда шифровать закрытые ключи со вторым секретным ключом
* Если весь кошелек в зашифрованном виде, запрашивать ключевую фразу при запуске
* По желанию забыть фразу после запуска, сохраняя при этом секретный ключ бумажника
* Если ключевая фраза была забыта, или нет всего кошелька шифрования, и пользователь хочет провести, приглашение на ключевую фразу снова
* Опять же, возможно, забыли кодовую фразу, проведя

Я думаю, что новые ключи все еще могут быть созданы автоматически. Просто создайте их в пакетном режиме загодя во время Потратьте операции.

Различные ключевые фразы для различных наборов ключей являются интересной идеей, но юзабилити бы начать страдать из-за сложности. Может быть лучше иметь отдельные бумажники.


Можно выделить три уровня атакующего:

1. Можно читать файлы пользователя

2. Можно читать пользовательские файлы / записи, но только для чтения системных файлов

3. Можно ли читать / писать все, привилегии суперпользователя


К сожалению, устают, будет писать позже.",

Я не думаю, что есть какая-то разница между # 2 и # 3. В любом случае, злоумышленник может прослушивать ключевую фразу пользователя.
devrandom сейчас офлайн Пожаловаться на devrandom   Ответить с цитированием Мультицитирование сообщения от devrandom Быстрый ответ на сообщение devrandom

28 марта 2011, 6:22:04 AM   # 9
 
 
Сообщения: 1222
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Там должно быть два уровня шифрования.

Весь кошелек должен быть (по желанию) AES шифрования.

Вложенные внутри этого бумажника пакет должен быть PGP приватным и открытый ключ. Этот секретный ключ должен быть зашифрован с AES (но с другим passphase)

Каждый секретный ключ Bitcoin должен быть зашифрован независимо от открытого ключа, так что делает новый Bitcoin адрес не будет требовать ввода секретного ключа passphase.

Когда первая загрузка, Bitcoin запросит ключ бумажника AES, если есть один. (Этот шаг является необязательным)

После того, как бумажник расшифрованы, клиент попросит "Сколько средств вы хотите сделать доступными для расходов, и как долго?"

Если ответ больше, чем «нет,» клиент попросит закрытый ключ passphase и расшифровать минимальное количество Bitcoin закрытых ключей, необходимых, чтобы сделать средства доступными и хранить их только в памяти. Passphase и расшифрованный глобальный секретный ключ будет автоматически удален (из памяти) после этой операции.

Если пользователь хочет, чтобы разблокировать больше средств, или хочет направить средства после того, как разблокированное время истекло, клиент Bitcoin попросят закрытый ключ passphase снова.
da2ce7 сейчас офлайн Пожаловаться на da2ce7   Ответить с цитированием Мультицитирование сообщения от da2ce7 Быстрый ответ на сообщение da2ce7

28 марта 2011, 7:30:32 AM   # 10
 
 
Сообщения: 1484
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Описана установка, что пользователь может разумно ожидать, чтобы понять, может быть: один пароль, чтобы разблокировать кошелек (весь-файл), а второй, чтобы тратить деньги (ECDSA закрытые ключи).

Однако ... Остается ЛАВАШ с текущей реализацией Bitcoin для выполнения шифрования целого файла на бумажнике. db4 имеет шифрование целого окружения, так это подразумевает шифровать-все решение будет шифровать бумажник, адр и blkindex базу данных.

Можно зашифровать «значение» часть каждой пары db4 ключ / значение, путем изменения базы данных Bitcoin читать () и Write () методы. Но ключи быть открытым текстом, я не уверен, что это полезно.

С текущей реализацией, вы заперли в много дизайнерских решениях, где, если вы отклониться вы должны переписать много кода во всем коде.

По этой причине, я надеялся, что патч будет сосредоточить дискуссию о том, что является разумным с текущим кодовым, а не идеальным решением, которое никогда не увидит свет.

jgarzik сейчас офлайн Пожаловаться на jgarzik   Ответить с цитированием Мультицитирование сообщения от jgarzik Быстрый ответ на сообщение jgarzik

29 марта 2011, 3:37:44 PM   # 11
 
 
Сообщений: 26
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Однако ... Остается ЛАВАШ с текущей реализацией Bitcoin для выполнения шифрования целого файла на бумажнике. db4 имеет шифрование целого окружения, так это подразумевает шифровать-все решение будет шифровать бумажник, адр и blkindex базу данных.


Это, кажется, не мешало бы зашифровать все? Я думаю, что симметричное шифрование может сделать весь блок цепи примерно на одну секунду.

http://www.cryptopp.com/benchmarks.html
devrandom сейчас офлайн Пожаловаться на devrandom   Ответить с цитированием Мультицитирование сообщения от devrandom Быстрый ответ на сообщение devrandom

29 марта 2011, 4:05:25 PM   # 12
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Один из способов их анализа осуществляется с помощью модели угроз. Что может сделать злоумышленник, который мы будем стараться, чтобы защититься от? И что мы не защищаться?

Можно выделить три уровня атакующего:

1. Можно читать файлы пользователя

2. Можно читать пользовательские файлы / записи, но только для чтения системных файлов

3. Можно ли читать / писать все, привилегии суперпользователя

Я думаю, что это правильный путь, чтобы думать об этом. И я думаю, что Джефф на самом деле реализует соломенный человек предложение именно то, что нужно делать.

Итак: я говорю, что мы не пытаемся защититься от (3), по крайней мере, не сейчас. Если у вас есть корень, то вы можете установить кейлоггер, чтение памяти, перехватывать любые системные вызовы, и т.д. и т.д. и т.п. (я хотел бы видеть кого-то реализовать Bitcoin клиента, который требуется проверка оплаты с помощью приложения мобильного телефона или телефонного звонок или PIN-посланного -в-почты и сделали все волшебное управление ключами, чтобы сделать эту работу надежно, но я думаю, что это выходит за рамки того, что мы можем разумно сделать прямо сейчас).

Защита против (1) и (2) поможет с:

а) вы забыли выйти из системы, так злоумышленник садится на свой компьютер, начинает Bitcoin и опустошает ваш кошелек.
б) злоумышленник овладевает резервную копию файловой системы, которая не зашифрована.
с) сисадмин устанавливает права доступа к файлам неправильно так нападавший на многопользовательской системе может читать ваши wallet.dat
d) злоумышленник угадает или узнает ваш пароль SSH, журналы удаленно и крадет wallet.dat.

Это не поможет:
- сисадмин с привилегиями суперпользователя является злом
- Система скомпрометирована руткит / Trojan / кейлогеру


RE: шифровать все: Я говорю, может быть, позже. Просто шифровать все не тривиально: пользователям придутся подождать минуту или две или десять для Berkeley DB переписать все blkindex.dat (узкое место будет дисковым ввод / вывод, а не шифрование), и мы имеем дело с "мой диск заполнен, когда я изменил свой пароль, то наполовину зашифрованы и наполовину нет, что мне теперь делать?"   И я не вижу много значения в шифровании всех wallet.dat; забудьте выключения Bitcoin и злоумышленник, который хочет знать ваши публичные адреса могут просто открыть адресную книгу и сделать скриншот.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

29 марта 2011, 8:30:40 PM   # 13
 
 
Сообщения: 1484
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Кроме того, недостаток безопасности, вы используете постоянный IV везде, похоже. Вы должны использовать различный IV для каждого шифрования.

Я не эксперт AES, поэтому разрешаю немой вопрос: действительно AES расшифровки требует знания IV, используемых для шифрования данного шифротекста?

С единственной информацией сохраняющейся между сеансами будучи ключевой фразой пользователя, что, казалось бы, подразумевает хранение IV для каждого шифрования?

jgarzik сейчас офлайн Пожаловаться на jgarzik   Ответить с цитированием Мультицитирование сообщения от jgarzik Быстрый ответ на сообщение jgarzik

30 марта 2011, 3:52:14 AM   # 14
 
 
Сообщений: 26
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Кроме того, недостаток безопасности, вы используете постоянный IV везде, похоже. Вы должны использовать различный IV для каждого шифрования.

Я не эксперт AES, поэтому разрешаю немой вопрос: действительно AES расшифровки требует знания IV, используемых для шифрования данного шифротекста?

С единственной информацией сохраняющейся между сеансами будучи ключевой фразой пользователя, что, казалось бы, подразумевает хранение IV для каждого шифрования?


IV всегда передается перед шифртекстом (или запомненный, в данном случае) и необходимо для расшифровки. Цель IV является, чтобы начать шифрование от случайного состояния, так что шифрование же открытого текста дважды не приводит к тому же шифротексту. Это предотвращает сравнения двух записей, которые имеют один и тот же начальный отрезок.
devrandom сейчас офлайн Пожаловаться на devrandom   Ответить с цитированием Мультицитирование сообщения от devrandom Быстрый ответ на сообщение devrandom

30 марта 2011, 6:11:21 AM   # 15
 
 
Сообщения: 1232
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Если вам удастся собрать много капельницы, то вы можете использовать те, которые являются такими же / аналогично сделать статистическую атаку, чтобы открыть секретный ключ. Это как трещины WEP, потому что это IV только 24 бит, и это не достаточно долго, чтобы убедиться, что тот же ключ дважды не используется. Там также другой недостаток, в котором вы можете вводить специальные пакеты, чтобы сделать AP изрыгать капельницы, но это уже совсем другая история: р
genjix сейчас офлайн Пожаловаться на genjix   Ответить с цитированием Мультицитирование сообщения от genjix Быстрый ответ на сообщение genjix

30 марта 2011, 6:39:07 AM   # 16
 
 
Сообщения: 2870
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Если вам удастся собрать много капельницы, то вы можете использовать те, которые являются такими же / аналогично сделать статистическую атаку, чтобы открыть секретный ключ.

Такого родом атака ключа восстановления является специфичным для RC4 (и, возможно, других потоковых шифров), я считаю.
theymos сейчас офлайн Пожаловаться на theymos   Ответить с цитированием Мультицитирование сообщения от theymos Быстрый ответ на сообщение theymos

31 марта 2011, 5:20:42 PM   # 17
 
 
Сообщения: 868
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Это большой шаг вперед. Я бы сказал, что решение должно оставаться сосредоточенным на индивидуальных пользователей, желающих легко провести некоторые биткойны и использовать его для выполнения операций. Таким образом, я бы голосовать против таких вещей, как позволяет несколько ключей, которые будут использоваться в том же бумажнике для различных подмножеств ключей. Торговцы или поставщики услуг, нуждающиеся в такие дополнительные функции можно настроить основной код клиента.

Кроме того, предполагая, что это не ослабит безопасность, я не думаю, шифруется весь бумажник необходимо (только закрытые ключи Bitcoin в БД отлично).

Я также хотел бы предложить, что вы не используете пользователи кодовую фразу непосредственно, но вместо того, чтобы использовать хэш (i..e SHA256) их ключевую фразу для шифрования. Это не добавлять какие-либо дополнительные меры безопасности для самого кошелька, но чтобы предотвратить ключевую фразу пользователя от воздействия должен клиент Bitcoin быть взломан и ключ дешифрования извлекается (и тем самым предлагая некоторую защиту для пользователей, которые используют ту же фразу для многих вещей ). Кроме того, необходимо обеспечить unhashed ключевая фраза пользователя не прилипает вокруг везде в памяти Bitcoins' случайно.

С точки зрения пользовательского интерфейса, я думаю, что при запуске, и при обращении к бумажник ... если это зашифрованное кошелек, пользователь должен ввести свои пароль ... там должен быть вариант, пользователь может установить, как долго клиент сохранит хэш пароля перед перезаписью и отбрасывая его из памяти ... после такого времени, если пользователю нужно что-то делать с участием частного ключа Bitcoin, они будут снова предложено ввести пароль. Если этот параметр установлен на 5 минут или около того по умолчанию, это достаточное количество времени, чтобы иметь бумажник замыкаться в случае, если пользователь оставляет клиент без присмотра. Другой вариант мог бы также позволить пользователю запрашивать пароль на всю историю использования секретного ключа и для клиента никогда не сохраняет хэш пароля за пределы времени, которое требуется, чтобы расшифровать и использовать секретный ключ (также, расшифрованные ключи никогда не должны быть сохранены в памяти дольше, чем время, необходимое для их использования).

Обратите внимание, что это также может быть хорошей идеей, чтобы заблокировать весь клиента и замаскировать UI, когда истекает таймаут ключевой фразы (это эффективно повторно использовать функцию шифрования бумажника, чтобы заблокировать весь клиент, но я бы не хотел, чтобы использовать отдельная ключевая фраза для этой цели).

Стив сейчас офлайн Пожаловаться на Steve   Ответить с цитированием Мультицитирование сообщения от Steve Быстрый ответ на сообщение Steve

31 марта 2011, 10:37:19 PM   # 18
 
 
Сообщения: 314
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Стив, как клиент теперь работает, все ключи бумажника считываются в память при запуске. Последующие изменения сделаны в памяти и записываются на диск. Этот предложенный патч расшифровывает ключи, как они считываются в память при запуске, и шифрует новые ключи, как они записаны на диск.

Дешифровка ключи на использование не будет слишком сложно. Добавить всплывающее окно, чтобы прочитать фразу, возможно, кэширует его на некоторое время, как вы предлагаете.

Как ни странно, самая сложная часть шифрования новых ключей, потому что Bitcoin создает ключи в нечетные времена. Самое любопытное время при получении платежа к "текущий адрес" отображается в верхней части окна. Bitcoin любит держать вещи свежим, так что генерирует новый адрес для отображения, и новый ключ. Но он не может зашифровать новый ключ без парольной фразы, и вообще ни один пользователь не вокруг, чтобы ответить на всплывающие окна в случайные моменты времени.
Hal сейчас офлайн Пожаловаться на Hal   Ответить с цитированием Мультицитирование сообщения от Hal Быстрый ответ на сообщение Hal

1 апреля 2011, 10:10:06 PM   # 19
 
 
Сообщения: 868
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Как ни странно, самая сложная часть шифрования новых ключей, потому что Bitcoin создает ключи в нечетные времена. Самое любопытное время при получении платежа к "текущий адрес" отображается в верхней части окна. Bitcoin любит держать вещи свежим, так что генерирует новый адрес для отображения, и новый ключ. Но он не может зашифровать новый ключ без парольной фразы, и вообще ни один пользователь не вокруг, чтобы ответить на всплывающие окна в случайные моменты времени.

Я думаю, что решение исправить клиент ... это странное поведение. Это на самом деле не нужно иметь адрес, отображаемый в любое время. При получении оплаты, клиент может просто очистить текущий адрес с дисплея. Если ни один пользователь не вокруг, то это для них невозможно разделить этот адрес в любом случае ... поэтому нет никакого смысла в создании нового адреса, пока пользователь на самом деле не хочет, чтобы отправить его кому-то для использования в оплате. Копировать в буфер обмена кнопки может вызвать генерацию нового адреса, когда не тока один.
Стив сейчас офлайн Пожаловаться на Steve   Ответить с цитированием Мультицитирование сообщения от Steve Быстрый ответ на сообщение Steve

14 апреля 2011, 12:29:28 AM   # 20
 
 
Сообщения: 1050
Цитировать по имени
цитировать ответ
по умолчанию Re: [PATCH] бумажника закрытого ключа шифрования

Будет ли криптографический безопасно использовать (хэш) открытый ключ в IV при шифровании секретного ключа части?

Еще одна идеи: хранить фактический случайно сгенерированный ключ AES для шифрования закрытых ключей в самом кошельке, зашифрованы себя с помощью ключа, полученного из ключевой фразы (с использованием славного ключом функции вывода у вас есть для скретч-карт?). Таким образом, вы можете легко изменить кодовую фразу без необходимости расшифровывать / reencrypt все в бумажнике. Этот зашифрованный ключ может также содержать версию хэшированных себя, для проверки целостности.

Изменение кодовая фраза RPC вызов / WX, что можно было бы добавить, и установить его в пустую строку будет удалить шифрование (и включить все EKEY поля обратно в ключевых областях).
Pieter Wuille сейчас офлайн Пожаловаться на Pieter Wuille   Ответить с цитированием Мультицитирование сообщения от Pieter Wuille Быстрый ответ на сообщение Pieter Wuille



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW