|
|
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Вот, наваял небольшой модуль для шифрования парами ключей RSA. Пример работает, но, как оказалось, не всё в нём так гладко: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. Пример работает, если шифровать публичным ключом, а расшифровывать приватным строки размером до 58 байт включительно (проверено на Delphi XE2, коим я буду сейчас пользоваться). Если длинна хоть на байт превышает - получаем ошибку. В принципе можно многократно шифровать буфер, но откуда взять точный его размер? Вдруг 58 байт - это только у меня так? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Раньше я пользовался FGInt, но под юникодными версиями Delphi он не работает (во всяком случае мне не удалось заставить его работать правильно, чтобы быть совместимым с не-юникодными делфями). Посему, собственно, вопросы: - Откуда получить необходимую константу-размер буфера для шифрования? - Как шифровать приватным ключом, чтобы расшифровывать публичным? (FGInt это поддерживал и я активно пользовался этой возможностью). Буду рад любой помощи и подсказкам! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 13:11 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
А что вы ожидали? Вы же храните зашифрованный текст в обычной строке - понятно, что при этом ни черта не соблюдается размер буфера (у строк он кратен 2, а вообще-то он должен быть произвольным). Я бы сделал для начала функции шифрования/дешифровки байтовых последовательностей, а уж потом бы сверху навешивал бы строковые функции - заодно и явно контролировал бы кодировку (UTF8, например). Но если уж очень хочется со строками и сразу, то хотя бы так: Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 17:43 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Тут дело не в строке. Ошибка возникает в вызове функции CryptEncrypt(HPair, 0, true, 0, nil, @EDataSize, 0) для определения длины выходного буфера. Входные параметры: дескриптор ключа и длина входного буфера. Тоже сейчас с этим мучаюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2012, 11:53 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Удалось выяснить следующее. Шифровать RSA может блоки длиной: ДлинаКлюча - 11 байт. Если ключ 1024 бита (это 128 байт), то шифровать можно максимум 117 байт (128 -11). пивафви, вы шифруете 58 символов (скорее всего в кодировке unicode), а это 118 байт.Отсюда и ошибка. Получается, что нельзя использовать один и тот же буфер как входной и выходной при шифровании, т.к. при попытке шифрования первого блока он затрет исходные данные еще незашифрованного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2012, 12:46 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Правильнее будет шифровать случайным сессионным ключом (созданным с помощью CryptGenKey ), а сессионный ключ уже шифровать ключевой парой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2012, 13:20 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Шифровать приватным ключом нельзя. Только публичным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2012, 16:17 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Генерирую и экспортирую в файлы приватный и публичный ключи Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Далее импортирую приватный ключ (публичный внутри него) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. При генерации я вижу: публичный ключ: 0602000000A40000525341310004000001000100... приватный ключ: 0702000000A40000525341320004000001000100... При импорте только приватного ключа (публичный внутри него) я вижу: публичный ключ: 0602000000A40000525341310004000001000100... приватный ключ: 0702000000000000000000000000000000000000... Подскажите, где и что не так делаю? Почему импорт приватного ключа работает (судя по ипортированному публичному) но сам приватный обнулён? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2018, 11:39 |
|
||
|
CryptAPI (RSA) - работа с парами ключей
|
|||
|---|---|---|---|
|
#18+
Навскидку: 1. CryptExportKey экспортирует же в бинарник. Зачем там TStringStream? 2. Флаг CRYPT_VERIFYCONTEXT попробуйте в CryptAcquireContext (последний аргумент). 3. Явно укажите MS_ENHANCED_PROV в CryptAcquireContext (третий аргумент). 4. Замените AT_KEYEXCHANGE на CALG_RSA_KEYX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2018, 14:08 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=37635313&tid=2040107]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
147ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 464ms |

| 0 / 0 |
