Обертка над libipriv.dll - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Помогите пожалуйста. Использую библиотеку libipriv.dll для расшифровки/шифровки данных. И тут понадобилось сгенерировать новый ключ. До меня работал человек, и была какая то программа для генерации карточек. Но человека нет, проги нет. В общем все печально. Нашел, все таки я что то похожее, и попытался сгенерировать. Код привожу ниже. И выдает вот такую ошибку.

Помощник по отладке управляемого кода "PInvokeStackImbalance" : "Вызов функции PInvoke "WindowsFormsApp2!WindowsFormsApp2.IPriv::Crypt_GenKeyCard" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой."

Вот экспорт библиотеки
Листинг программы
  1. public class IPriv
  2. {
  3. // for internal usage only
  4. #region dll functions
  5. [DllImport("libipriv.dll")]
  6. internal static extern int Crypt_Initialize();
  7. [DllImport("libipriv.dll")]
  8. internal static extern int Crypt_Done();
  9. [DllImport("libipriv.dll")]
  10. internal static extern int Crypt_OpenSecretKeyFromFile(
  11. int eng,
  12. [MarshalAs(UnmanagedType.LPStr)]string path,
  13. [MarshalAs(UnmanagedType.LPStr)]string passwd,
  14. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey);
  15. [DllImport("libipriv.dll")]
  16. internal static extern int Crypt_OpenPublicKeyFromFile(
  17. int eng,
  18. [MarshalAs(UnmanagedType.LPStr)]string path,
  19. uint keyserial,
  20. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey,
  21. [MarshalAs(UnmanagedType.LPArray)]byte[] сakey);
  22. [DllImport("libipriv.dll")]
  23. internal static extern int Crypt_Sign(
  24. [MarshalAs(UnmanagedType.LPStr)]string src,
  25. int nsrc,
  26. [MarshalAs(UnmanagedType.LPStr)]StringBuilder dst,
  27. int ndst,
  28. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey);
  29. [DllImport("libipriv.dll")]
  30. internal static extern int Crypt_Verify(
  31. [MarshalAs(UnmanagedType.LPStr)]string src,
  32. int nsrc,
  33. [MarshalAs(UnmanagedType.LPArray)]byte[] pdst,
  34. [MarshalAs(UnmanagedType.LPArray)]byte[] pndst,
  35. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey);
  36. [DllImport("libipriv.dll")]
  37. internal static extern int Crypt_CloseKey(
  38. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey);
  39. [DllImport("libipriv.dll")]
  40. internal static extern int Crypt_GenKeyCard(
  41. [MarshalAs(UnmanagedType.LPStr)]StringBuilder dst,
  42. int ndst,
  43. [MarshalAs(UnmanagedType.LPStr)]string userid,
  44. long keyserial);
  45. [DllImport("libipriv.dll")]
  46. internal static extern int Crypt_GenKeyCardToFile(
  47. [MarshalAs(UnmanagedType.LPStr)]string path,
  48. [MarshalAs(UnmanagedType.LPStr)]string userid,
  49. long keyserial);
  50. [DllImport("libipriv.dll")]
  51. internal static extern int Crypt_GenKey(
  52. int eng,
  53. [MarshalAs(UnmanagedType.LPStr)]string src,
  54. int nsrc,
  55. [MarshalAs(UnmanagedType.LPArray)]byte[] skey,
  56. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey,
  57. int bits);
  58. [DllImport("libipriv.dll")]
  59. internal static extern int Crypt_GenKeyFromFile(
  60. int eng,
  61. [MarshalAs(UnmanagedType.LPStr)]string keycardpath,
  62. [MarshalAs(UnmanagedType.LPArray)]byte[] skey,
  63. [MarshalAs(UnmanagedType.LPArray)]byte[] pkey,
  64. int bits);
  65. [DllImport("libipriv.dll")]
  66. internal static extern int Crypt_ExportPublicKey(
  67. [MarshalAs(UnmanagedType.LPStr)]StringBuilder dst,
  68. int ndst,
  69. [MarshalAs(UnmanagedType.LPArray)]byte[] key,
  70. [MarshalAs(UnmanagedType.LPArray)]byte[] cakey);
  71. [DllImport("libipriv.dll")]
  72. internal static extern int Crypt_ExportPublicKeyToFile(
  73. [MarshalAs(UnmanagedType.LPStr)]string path,
  74. [MarshalAs(UnmanagedType.LPArray)]byte[] key,
  75. [MarshalAs(UnmanagedType.LPArray)]byte[] cakey);
  76. // Экспорт закрытого ключа (может не поддерживаться криптопровайдером).
  77. // dst: выходной, буфер для приема закрытого ключа
  78. // ndst: входной, максимальная длина приемного буфера
  79. // path: входной, путь к файлу для закрытого ключа
  80. // passwd: входной, кодовая фраза для шифрования закрытого ключа
  81. // key: входной, закрытый ключ
  82. // Возвращает: длина тела ключа или код ошибки
  83. [DllImport("libipriv.dll")]
  84. internal static extern int Crypt_ExportSecretKey(
  85. [MarshalAs(UnmanagedType.LPStr)]StringBuilder dst,
  86. int ndst,
  87. [MarshalAs(UnmanagedType.LPStr)]string passwd,
  88. [MarshalAs(UnmanagedType.LPArray)]byte[] key);
  89. [DllImport("libipriv.dll")]
  90. internal static extern int Crypt_ExportSecretKeyToFile(
  91. [MarshalAs(UnmanagedType.LPStr)]string path,
  92. [MarshalAs(UnmanagedType.LPStr)]string passwd,
  93. [MarshalAs(UnmanagedType.LPArray)]byte[] key);
  94. #endregion
  95.  
  96. /// <summary>
  97. /// Инициализирует криптосистему. Запускать один раз за все приложение.
  98. /// </summary>
  99. public static void Initialize()
  100. {
  101. Crypt_Initialize();
  102. }
  103. /// <summary>
  104. /// Закрывает криптосистему. Запускать один раз за все приложение.
  105. /// </summary>
  106. public static void Done()
  107. {
  108. Crypt_Done();
  109. }
  110. /// <summary>
  111. /// Загружает секретный ключ
  112. /// </summary>
  113. /// <param name="path">Путь к файлу ключа</param>
  114. /// <param name="passwd">Пароль к ключу</param>
  115. /// <returns></returns>
  116. public static IPrivKey openSecretKey(string path, string passwd)
  117. {
  118. IPrivKey k = new IPrivKey();
  119. int rc = Crypt_OpenSecretKeyFromFile(0, path, passwd, k.getKey());
  120. if (rc != 0)
  121. throw (new IPrivException(rc));
  122. return k;
  123. }
  124. /// <summary>
  125. /// Загружает открытый ключ
  126. /// </summary>
  127. /// <param name="path">Файл ключа</param>
  128. /// <param name="keyserial">Серийный ключ</param>
  129. /// <returns></returns>
  130. public static IPrivKey openPublicKey(string path, uint keyserial)
  131. {
  132. IPrivKey k = new IPrivKey();
  133. int rc = Crypt_OpenPublicKeyFromFile(0, path, keyserial, k.getKey(), null);
  134. if (rc != 0)
  135. throw (new IPrivException(rc));
  136. return k;
  137. }
  138. /// <summary>
  139. /// Подписывает сообщение секретным ключом
  140. /// </summary>
  141. /// <param name="src">Сообщение</param>
  142. /// <param name="key">Секретный ключ</param>
  143. /// <returns></returns>
  144. public static string signText(string src, IPrivKey key)
  145. {
  146. string dst;
  147. StringBuilder tmp = new StringBuilder(Encoding.UTF8.GetByteCount(src) + 1024);
  148. int rc = Crypt_Sign(src, src.Length, tmp, tmp.Capacity, key.getKey());
  149. if (rc < 0)
  150. throw (new IPrivException(rc));
  151. dst = tmp.ToString(0, rc);
  152. return dst;
  153. }
  154. /// <summary>
  155. /// Проверяет сообщение открытым ключом
  156. /// </summary>
  157. /// <param name="src">Сообщение</param>
  158. /// <param name="key">Открытый ключ</param>
  159. /// <returns></returns>
  160. public static string verifyText(string src, IPrivKey key)
  161. {
  162. int rc = Crypt_Verify(src, -1, null, null, key.getKey());
  163. if (rc != 0)
  164. throw (new IPrivException(rc));
  165. return "";
  166. }
  167. /// <summary>
  168. /// Закрывает ключ
  169. /// </summary>
  170. /// <param name="key"></param>
  171. public static void closeKey(IPrivKey key)
  172. {
  173. Crypt_CloseKey(key.getKey());
  174. }
  175. /// <summary>
  176. /// Генерирует карточку ключа на основе идентификатора пользователя и его ключа
  177. /// </summary>
  178. /// <param name="userId">Идентификатор пользователя, для которого генерируется карточка</param>
  179. /// <param name="serialKey">Серийный ключ карточки</param>
  180. /// <returns></returns>
  181. public static string GenerateCard(string userId, int serialKey)
  182. {
  183. string card = "";
  184. StringBuilder tmp = new StringBuilder(10048);
  185. int rc = Crypt_GenKeyCard(tmp, tmp.Capacity, userId, (long)serialKey);
  186. if (rc < 0)
  187. throw (new IPrivException(rc));
  188. card = tmp.ToString(0, rc);
  189. return card;
  190. }
  191. /// <summary>
  192. /// Генерирует карточку в файл
  193. /// </summary>
  194. /// <param name="filename">Имя файла</param>
  195. /// <param name="userId">Id пользователя</param>
  196. /// <param name="serialKey">Серийный ключ</param>
  197. public static void GenerateCardToFile(string filename, string userId, int serialKey)
  198. {
  199. int rc = Crypt_GenKeyCardToFile(filename, userId, (long)serialKey);
  200. if (rc < 0)
  201. throw (new IPrivException(rc));
  202. }
  203. /// <summary>
  204. /// Генерирует ключи на основе раннее сгенерированной карточки
  205. /// </summary>
  206. /// <param name="card">Карточка ключа</param>
  207. /// <param name="skey">Секретный ключ</param>
  208. /// <param name="pkey">Открытый ключ</param>
  209. public static void GenerateKey(string card, IPrivKey skey, IPrivKey pkey)
  210. {
  211. IPrivKey SKey = new IPrivKey();
  212. IPrivKey PKey = new IPrivKey();
  213. Crypt_GenKey(0, card, -1, SKey.getKey(), PKey.getKey(), 512);
  214. skey = SKey;
  215. pkey = PKey;
  216. }
  217. /// <summary>
  218. /// Экспорт закрытого ключа
  219. /// </summary>
  220. /// <param name="skey">Ключ</param>
  221. /// <param name="passwd">Пароль</param>
  222. /// <returns></returns>
  223. public static string ExportSecretKey(IPrivKey skey, string passwd)
  224. {
  225. StringBuilder sb = new StringBuilder(10048);
  226. Crypt_ExportSecretKey(sb, sb.Capacity, passwd, skey.getKey());
  227. return sb.ToString();
  228. }
  229. /// <summary>
  230. /// Экспорт закрытого ключа в файл
  231. /// </summary>
  232. /// <param name="filename">Имя файла</param>
  233. /// <param name="key">Ключ</param>
  234. /// <param name="passwd">Пароль</param>
  235. public static void ExportSecretKeyToFile(string filename, IPrivKey key, string passwd)
  236. {
  237. Crypt_ExportSecretKeyToFile(filename, passwd, key.getKey());
  238. }
  239. /// <summary>
  240. /// Экспорт открытого ключа
  241. /// </summary>
  242. /// <param name="pkey">Ключ</param>
  243. /// <param name="skey">Серийный ключ</param>
  244. /// <returns></returns>
  245. public static string ExportPublicKey(IPrivKey pkey, IPrivKey skey)
  246. {
  247. StringBuilder sb = new StringBuilder(10048);
  248. Crypt_ExportPublicKey(sb, sb.Capacity, pkey.getKey(), skey.getKey());
  249. return sb.ToString();
  250. }
  251. };
А вот сам код
Листинг программы
  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. IPriv.Initialize();
  4. string val = "";
  5. try
  6. {
  7. val = IPriv.GenerateCard(textBox1.Text, Convert.ToInt32(numericUpDown1.Value));
  8. IPriv.GenerateCardToFile(textBox1.Text + ".dat", textBox1.Text, Convert.ToInt32(numericUpDown1.Value));
  9. IPrivKey skey = new IPrivKey();
  10. IPrivKey pkey = new IPrivKey();
  11.  
  12. IPriv.GenerateKey(val, skey, pkey);
  13. pkey.closeKey();
  14. skey.closeKey();
  15. }
  16. catch (IPrivException ex)
  17. {
  18. MessageBox.Show(ex.ToString());
  19. }
  20. IPriv.Done();
  21. }
Что интересно функции шифрования, таких проблем в этом же проекте не вызывают. Манифест о вызове неуправляемого кода, пытался добавлять
Листинг программы
  1. CallingConvention = CallingConvention.StdCall
. Ошибка та же. Помогите будьте добры. Не силен в использовании нативных библиотек.

Решение задачи: «Обертка над libipriv.dll»

textual
Листинг программы
  1.         [DllImport("libipriv.dll")]
  2.         internal static extern int Crypt_GenKeyCard(
  3.             [MarshalAs(UnmanagedType.LPStr)]StringBuilder dst,
  4.             int ndst,
  5.             [MarshalAs(UnmanagedType.LPStr)]string userid,
  6.             uint keyserial);

ИИ поможет Вам:


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

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут