Инициализация RSACryptoServiceProvider приватным ключем
От: Dronopotamus Россия  
Дата: 15.01.07 09:02
Оценка:
Добрый день.
Стоит задача инициализировать RSACryptoServiceProvider только приватным ключем — для того чтобы им можно было только расшифровывать данные, но не зашифровывать.
Как мы знаем из мсдн, параметры алгоритма RSA в дотнет задаются структурой RSAParameters, и как мы знаем из теории, открытым ключем является Modulus+Exponent, закрытым — Modulus+D.
Дальше интереснее — при попытке инициализации провайдера структурой RSAParameters, содержащей только открытый ключ — все ок, провайдер инициализируется и им можно зашифровать данные. При попытке же инициализации только приватным ключем кидается ексепшн "Bad Key", почему-то реализация хочет чтобы было обязательно заполнено поле Exponent в структуре RSAParameters, т.е. чтобы она обязательно содержала и открытый ключ. Хотя например для расшифровки он не нужен.
Как обойти это? Я планировал ключ для шифрования ("открытый") держать в секрете, а для расшифрования ("закрытый") опубликовать...

ЗЫ. Про проблемму с маленьким D я вкурсе, я думал сгенерировать ключ с D приличной длинны...
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re: Инициализация RSACryptoServiceProvider приватным ключем
От: AMogil Россия  
Дата: 15.01.07 09:14
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>Добрый день.

D>Как обойти это? Я планировал ключ для шифрования ("открытый") держать в секрете, а для расшифрования ("закрытый") опубликовать...
D>ЗЫ. Про проблемму с маленьким D я вкурсе, я думал сгенерировать ключ с D приличной длинны...

Зачем шифровать то, что может рассшифроать каждый (имея закрытый ключь для расшифровки)?
... << RSDN@Home 1.2.0 alpha rev. 668>>

Re[2]: Инициализация RSACryptoServiceProvider приватным ключ
От: Dronopotamus Россия  
Дата: 15.01.07 09:18
Оценка:
Здравствуйте, AMogil, Вы писали:

AM>Здравствуйте, Dronopotamus, Вы писали:


D>>Добрый день.

D>>Как обойти это? Я планировал ключ для шифрования ("открытый") держать в секрете, а для расшифрования ("закрытый") опубликовать...
D>>ЗЫ. Про проблемму с маленьким D я вкурсе, я думал сгенерировать ключ с D приличной длинны...

AM>Зачем шифровать то, что может рассшифроать каждый (имея закрытый ключь для расшифровки)?


для распространения лицензионной информации
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[3]: Инициализация RSACryptoServiceProvider приватным ключ
От: AMogil Россия  
Дата: 15.01.07 09:36
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>Здравствуйте, AMogil, Вы писали:


D>для распространения лицензионной информации


Меня почему-то не покидает смутное ощущение, что вы на каком-то повороте свернули не туда .
Задачи по шифрованию/подписыванию данных типичны. Вы же пытаетесь воспользоватся технологией "задом-наперед"

По сути вопроса сказать ничего не могу
... << RSDN@Home 1.2.0 alpha rev. 668>>

Re[4]: Инициализация RSACryptoServiceProvider приватным ключ
От: Dronopotamus Россия  
Дата: 15.01.07 09:47
Оценка: -1
Здравствуйте, AMogil, Вы писали:

AM>Меня почему-то не покидает смутное ощущение, что вы на каком-то повороте свернули не туда .

AM>Задачи по шифрованию/подписыванию данных типичны. Вы же пытаетесь воспользоватся технологией "задом-наперед"

да нет, вообще без разницы какой ключ публиковать а какой нет
факт тот, что для расшифровки нужен только закрытый,а для шифрования — только открытый, но микрософт как всегда думает иначе )
буду смотреть в сторону crypto++
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re: Инициализация RSACryptoServiceProvider приватным ключем
От: SergioR Российская Империя  
Дата: 15.01.07 11:11
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

D>При попытке же инициализации только приватным ключем кидается ексепшн "Bad Key", почему-то реализация хочет чтобы было обязательно заполнено поле Exponent в структуре RSAParameters, т.е. чтобы она обязательно содержала и открытый ключ. Хотя например для расшифровки он не нужен.


Подойдет ли просто подсунуть ему сгенеренный случайный открытый ключ? Делает ли RSACSP проверку на соответствие между ключами? Если нет, то все ОК.
Re[2]: Инициализация RSACryptoServiceProvider приватным ключ
От: Dronopotamus Россия  
Дата: 15.01.07 15:14
Оценка:
Здравствуйте, SergioR, Вы писали:

SR>Подойдет ли просто подсунуть ему сгенеренный случайный открытый ключ? Делает ли RSACSP проверку на соответствие между ключами? Если нет, то все ОК.


я пробовал, проверяет .
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[5]: Инициализация RSACryptoServiceProvider приватным ключ
От: Morpheus_  
Дата: 15.01.07 17:56
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

AM>>Меня почему-то не покидает смутное ощущение, что вы на каком-то повороте свернули не туда .

AM>>Задачи по шифрованию/подписыванию данных типичны. Вы же пытаетесь воспользоватся технологией "задом-наперед"

D>да нет, вообще без разницы какой ключ публиковать а какой нет

D>факт тот, что для расшифровки нужен только закрытый,а для шифрования — только открытый, но микрософт как всегда думает иначе )
D>буду смотреть в сторону crypto++

а не проще ли в таком случае не шифровать данные, а просто подписать их?
Подписать сможет только владелец закрытого ключа, а вот проверить может каждый у кого есть открытый ключ...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Инициализация RSACryptoServiceProvider приватным ключ
От: Morpheus_  
Дата: 15.01.07 17:58
Оценка:
Просто не вижу смысла шифровать то что каждый сможет расшифровать
А цифровая подпись какраз и решает необходимую вам задачу, шифровать при этом не нужно (все равно ведь все смогут расшифровать)...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Инициализация RSACryptoServiceProvider приватным ключ
От: Dronopotamus Россия  
Дата: 15.01.07 19:29
Оценка: -1
Здравствуйте, Morpheus_, Вы писали:

M_>А цифровая подпись какраз и решает необходимую вам задачу, шифровать при этом не нужно (все равно ведь все смогут расшифровать)...


цифровая подпись — это тоже шифрование, только не сообщения, а его хеша. И тоже ключ для шифрования ("открытый") держится в секрете, а для расшифрования — публикуется. По сути вопроса плз )
Удар судьбы в лоб означает, что не возымели действия ее пинки под зад
Re[8]: Инициализация RSACryptoServiceProvider приватным ключ
От: Morpheus_  
Дата: 16.01.07 09:01
Оценка: -3
Здравствуйте, Dronopotamus, Вы писали:

M_>>А цифровая подпись какраз и решает необходимую вам задачу, шифровать при этом не нужно (все равно ведь все смогут расшифровать)...


D>цифровая подпись — это тоже шифрование, только не сообщения, а его хеша.



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

D>И тоже ключ для шифрования ("открытый") держится в секрете, а для расшифрования — публикуется.


нет, ты ошибся, для подписи необходим закрытый ключ, для проверки — открытый, учите матчасть

D>По сути вопроса плз )


исходник чтоли нужен?
держи

подпись:
    byte[] buffer2 = Encoding.Unicode.GetBytes(licenseText);    // блок данных для подписи
    RSACryptoServiceProvider myprov = new RSACryptoServiceProvider(0x400);
    myprov.FromXmlString(privateKey);
    SHA1 sha1 = new SHA1CryptoServiceProvider();
    byte[] buffer3 = sha1.ComputeHash(buffer2);

    RSAPKCS1SignatureFormatter formatter1 = new RSAPKCS1SignatureFormatter(myprov);
    formatter1.SetHashAlgorithm("SHA1");
    byte[] buffer1 = formatter1.CreateSignature(buffer3);        // полученая подпись


проверка подписи:
    byte[] buffer1 = Decode(signText);        // подпись
    RSACryptoServiceProvider provider = new RSACryptoServiceProvider(0x400);
    provider.FromXmlString(publicKey);
    byte[] buffer2 = Encoding.Unicode.GetBytes(licenseText);    // подписаный блок данных
    SHA1 sha = new SHA1CryptoServiceProvider();
    byte[] buffer3 = sha.ComputeHash(buffer2);
    RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(provider);
    deformatter.SetHashAlgorithm("SHA1");
    bool ValidLicense = deformatter.VerifySignature(buffer3, buffer1);


Подпись добавляется в конец текста с лецензионными данными (обычно он XML-е подобный), откуда потом и достается назад

Практика показала что текст с типом лицензии лучше сконвертить в абракадабру, чтобы пользователь не внес в него случайно лишних пробелов или табуляций, ключи для этого не нужны
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Инициализация RSACryptoServiceProvider приватным ключ
От: Morpheus_  
Дата: 17.01.07 00:14
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

SR>>Подойдет ли просто подсунуть ему сгенеренный случайный открытый ключ? Делает ли RSACSP проверку на соответствие между ключами? Если нет, то все ОК.


D>я пробовал, проверяет .


ты бы вместо того чтобы минусы за дельные советы, с проверенным рабочим кодом ставить (не утруждая себя даже на изобретение обоснований своего несогласия) и выдумывать несуществующие проблемы, лучше бы проверил цифровую подпись и убедился в том что минус поставил по своей глупости
Re[9]: Инициализация RSACryptoServiceProvider приватным ключ
От: Morpheus_  
Дата: 17.01.07 00:28
Оценка:
Ну спасибо за минус, я так понял правильное решение вам не подходит и вы ищите неправильное?
Re[8]: Инициализация RSACryptoServiceProvider приватным ключ
От: Morpheus_  
Дата: 17.01.07 00:32
Оценка:
Здравствуйте, Dronopotamus, Вы писали:

M_>>А цифровая подпись какраз и решает необходимую вам задачу, шифровать при этом не нужно (все равно ведь все смогут расшифровать)...


D>цифровая подпись — это тоже шифрование, только не сообщения, а его хеша. И тоже ключ для шифрования ("открытый") держится в секрете, а для расшифрования — публикуется. По сути вопроса плз )


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