Заранее прошу прощенья, если не совсем в тот форум...
Проблема с цифрофой подписью (DSA). Клиент на VC++, сервер на JAVA.
Посредством CryptoAPI создаем ключи и экспортируем public key: (проверки пропущены)
HCRYPTPROV hProvd = 0;
HCRYPTKEY hKey = 0;
DWORD dwBlobLen = 0;
PBYTE pbKeyBlob = NULL;
FILE *hDestination;
// активизация криптопровайдера
CryptAcquireContext(&hProvd, NULL, "Microsoft Base DSS Cryptographic Provider",
PROV_DSS, 0);
if(lastError == NTE_BAD_KEYSET){
CryptAcquireContext(&hProv, NULL, "Microsoft Base DSS Cryptographic Provider",
PROV_DSS, CRYPT_NEWKEYSET);
//showError(GetLastError());
// генерация ключа
res = CryptGenKey(hProvd, CALG_DSS_SIGN, CRYPT_EXPORTABLE, &hKey );
// создание public ключа
res = CryptGetUserKey(hProvd, AT_SIGNATURE, &hKey);
// экспортирование ключа
res = CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, NULL, &dwBlobLen);
pbKeyBlob = new BYTE[dwBlobLen];
res = CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen);
// --- сохранение ключа в файле
hDestination = fopen("c:\\publicKey.key", "wb");
fwrite(pbKeyBlob, 1, dwBlobLen, hDestination);
fclose(hDestination);
delete[]pbKeyBlob;
Затем из кода JAVA пытаюсь загрузить этот ключ:
byte[] key = null;
PublicKey publicKey = null;
try{
// readKeyFromFile - читает из файла и возвращает его содержимое в виде byte[]
if( (key = readKeyFromFile("с:/publicKey.key")) != null )
publicKey = new DSAPublicKey(key);
}catch(Exception ex){
System.err.println("Error [readPublicKey]: " + ex.toString());
}
В результате получаю:
java.security.InvalidKeyException: invalid key format
Может кто сталкивался с такой проблемой?
Заранее спасибо.