Ejemplo n.º 1
0
void Widget::on_keyErr_clicked()
{
    DWORD keyBlobLen, blockLen = 0;
    BYTE *keyBlob, *srcData, *newData, *blockData1, *blockData2;
    HCRYPTPROV hCryptProv;
    HCRYPTKEY hKey, dhKey;
    QVector<int> values;
    QFile myFile(fName);

    plot->clear();
    if (myFile.exists())
        myFile.open(QIODevice::ReadOnly);
    else
    {
        QMessageBox::critical(0, "Ошибка", "Файл не выбран", QMessageBox::Ok);
        return;
    }
    CryptAcquireContext(&hCryptProv, NULL, MS_DEF_RSA_SCHANNEL_PROV, PROV_RSA_SCHANNEL, CRYPT_VERIFYCONTEXT);
    CryptGenKey(hCryptProv, CALG_AES_256, 0, &hKey);
    CryptEncrypt(hKey, 0, true, 0, NULL, &blockLen, myFile.size());
    srcData = new BYTE[block * blockLen];
    newData = new BYTE[block * blockLen];
    blockData1  = new BYTE[blockLen];
    blockData2  = new BYTE[blockLen];
    myFile.read((char*)srcData, block * blockLen);
    myFile.close();
    memcpy((char*)newData, (char*)srcData, block * blockLen);
    newData[0] = -newData[0];
    CryptDuplicateKey(hKey, NULL, 0, &dhKey);
    CryptExportKey(dhKey, 0, SIMPLEBLOB, 0, NULL, &keyBlobLen);
    keyBlob = new BYTE[keyBlobLen];
    CryptExportKey(dhKey, 0, SIMPLEBLOB, 0, keyBlob, &keyBlobLen);
    keyBlob[0] = -keyBlob[0];
    CryptImportKey(hCryptProv, keyBlob, keyBlobLen, 0, 0, &dhKey);
    for (uint i = 0; i < (block * blockLen); i++)
    {
        CryptEncrypt(hKey, 0, i < 2, 0, srcData + i, &blockLen, block * blockLen);
        CryptEncrypt(dhKey, 0, i < 2, 0, newData + i, &blockLen, block * blockLen);
    }
    for(uint i = 0; i < (block * blockLen); i += blockLen)
    {
        int k = 0;
        memcpy(blockData1, srcData + i, blockLen);
        memcpy(blockData2, newData + i, blockLen);
        for (uint j = i; j < (i + blockLen); j++)
            k += trueBitsCount(srcData[j] ^ newData[j]);
        values.push_back(k);
    }
    delete[] newData;
    delete[] srcData;
    delete[] blockData1;
    delete[] blockData2;
    delete[] keyBlob;
    CryptReleaseContext(hCryptProv, 0);
    CryptDestroyKey(hKey);
    CryptDestroyKey(dhKey);
    DrawPlot(plot, values);
    plot->show();
}
Ejemplo n.º 2
0
// Called by sqlite and sqlite3_key_interop to attach a key to a database.
int sqlite3CodecAttach(sqlite3 *db, int nDb, const void *pKey, int nKeyLen)
{
  int rc = SQLITE_ERROR;
  HCRYPTKEY hKey = 0;

  // No key specified, could mean either use the main db's encryption or no encryption
  if (!pKey || !nKeyLen)
  {
    if (!nDb)
    {
      return SQLITE_OK; // Main database, no key specified so not encrypted
    }
    else // Attached database, use the main database's key
    {
      // Get the encryption block for the main database and attempt to duplicate the key
      // for use by the attached database
      Pager *p = sqlite3BtreePager(db->aDb[0].pBt);
      LPCRYPTBLOCK pBlock = (LPCRYPTBLOCK)sqlite3pager_get_codecarg(p);

      if (!pBlock) return SQLITE_OK; // Main database is not encrypted so neither will be any attached database
      if (!pBlock->hReadKey) return SQLITE_OK; // Not encrypted

      if (!CryptDuplicateKey(pBlock->hReadKey, NULL, 0, &hKey))
        return rc; // Unable to duplicate the key
    }
  }
  else // User-supplied passphrase, so create a cryptographic key out of it
  {
    hKey = DeriveKey(pKey, nKeyLen);
    if (hKey == MAXDWORD)
    {
      sqlite3Error(db, rc, SQLITECRYPTERROR_PROVIDER);
      return rc;
    }
  }

  // Create a new encryption block and assign the codec to the new attached database
  if (hKey)
  {
    Pager *p = sqlite3BtreePager(db->aDb[nDb].pBt);
    LPCRYPTBLOCK pBlock = CreateCryptBlock(hKey, p, -1, NULL);
    if (!pBlock) return SQLITE_NOMEM;

    sqlite3PagerSetCodec(p, sqlite3Codec, sqlite3CodecSizeChange, sqlite3CodecFree, pBlock);
    //db->aDb[nDb].pAux = pBlock;
    //db->aDb[nDb].xFreeAux = DestroyCryptBlock;

    rc = SQLITE_OK;
  }
  return rc;
}
Ejemplo n.º 3
0
// @pymethod <o PyCRYPTKEY>|PyCRYPTKEY|CryptDuplicateKey|Creates an independent copy of the key
PyObject *PyCRYPTKEY::PyCryptDuplicateKey(PyObject *self, PyObject *args, PyObject *kwargs)
{
	static char *keywords[]={"Reserved", "Flags", NULL};
	PyObject *ret=NULL;
	DWORD dwFlags=0, dwReserved=0;
	HCRYPTKEY hcryptkey, hcryptkeydup;
	hcryptkey=((PyCRYPTKEY *)self)->GetHCRYPTKEY();

	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|kk:CryptDuplicateKey", keywords,
		&dwReserved,	// @pyparm int|Reserved|0|Use 0 if passed in
		&dwFlags))		// @pyparm int|Flags|0|Also reserved, use 0
		return NULL;
	if (CryptDuplicateKey(hcryptkey, &dwReserved, dwFlags, &hcryptkeydup))
		ret = new PyCRYPTKEY(hcryptkeydup, ((PyCRYPTKEY *)self)->obcryptprov);
	else
		PyWin_SetAPIError("CryptDuplicateKey",GetLastError());
	return ret;
}
Ejemplo n.º 4
0
/*
 * Class:     org_company_security_csp_NativeCrypto
 * Method:    encryptDecrypt
 * Signature: ([BIJJZ)[B
 */
JNIEXPORT jbyteArray JNICALL Java_org_company_security_csp_NativeCrypto_encryptDecrypt(
		JNIEnv *env, jclass clazz,
		jbyteArray jData, jint jDataOffset, jint jDataSize,
		jlong hKey, jboolean doEncrypt, jboolean doFinal,
		jint jPaddingLength) {
	jbyteArray result = NULL;
	jbyte* pData = NULL;
	DWORD dwDataLen = (DWORD) jDataSize;
	DWORD dwBufLen = dwDataLen;
	DWORD i;
	BYTE tmp;
	HCRYPTKEY hDuplicateKey = (HCRYPTKEY) NULL;
	DWORD dwOffset;

	{
		if (! CryptDuplicateKey(hKey, NULL, 0, &hDuplicateKey)) {
#ifdef DEBUG
			fprintf(stderr, "error CryptDuplicateKey\n");
#endif
			ThrowException(env, INVALID_KEY_EXCEPTION, GetLastError());
			goto _m_leave;
		}

		if(jPaddingLength <= 0)
			jPaddingLength = 512;

		dwOffset = dwDataLen % jPaddingLength;
		if(dwOffset)
			dwBufLen = dwDataLen - dwOffset + jPaddingLength;

		// Copy data from Java buffer to native buffer
		pData = (jbyte*) malloc(dwBufLen);
		(*env)->GetByteArrayRegion(env, jData, jDataOffset, jDataSize, pData);

		if (doEncrypt == JNI_TRUE) {
			// encrypt
			if (! CryptEncrypt((HCRYPTKEY) hDuplicateKey, 0, doFinal, 0, (BYTE *)pData,
							&dwDataLen, dwBufLen)) {

#ifdef DEBUG
				fprintf(stderr, "error CryptEncrypt %x\n", GetLastError());
#endif
				ThrowException(env, INVALID_KEY_EXCEPTION, GetLastError());
				goto _m_leave;
			}
			dwBufLen = dwDataLen;

			// convert from little-endian
			for (i = 0; i < dwBufLen / 2; i++) {
				tmp = pData[i];
				pData[i] = pData[dwBufLen - i -1];
				pData[dwBufLen - i - 1] = tmp;
			}
		} else {
			// convert to little-endian
			for (i = 0; i < dwBufLen / 2; i++) {
				tmp = pData[i];
				pData[i] = pData[dwBufLen - i -1];
				pData[dwBufLen - i - 1] = tmp;
			}

			// decrypt
			if (! CryptDecrypt((HCRYPTKEY) hKey, 0, TRUE, 0, (BYTE *)pData, &dwBufLen)) {

#ifdef DEBUG
				fprintf(stderr, "error CryptDecrypt %x\n", GetLastError());
#endif
				ThrowException(env, INVALID_KEY_EXCEPTION, GetLastError());
				goto _m_leave;
			}
		}

		// Create new byte array
		result = (*env)->NewByteArray(env, dwBufLen);

		// Copy data from native buffer to Java buffer
		(*env)->SetByteArrayRegion(env, result, 0, dwBufLen, (jbyte*) pData);
	}
	_m_leave:
	{
		if (pData)
			free(pData);

		if (hDuplicateKey)
			CryptDestroyKey(hDuplicateKey);
	}

	return result;
}
Ejemplo n.º 5
-1
BOOL kull_m_crypto_aesCTSDecrypt(HCRYPTKEY hKey, PBYTE data, DWORD szData, PBYTE pbIV)
{
	BOOL status = FALSE;
	DWORD nbBlock, lastLen, i;
	BYTE buffer[32], *ptr;
	HCRYPTKEY hKeyNoIV;

	if(szData > 16)
	{
		if(CryptDuplicateKey(hKey, NULL, 0, &hKeyNoIV))
		{
			if(CryptSetKeyParam(hKey, KP_IV, pbIV, 0))
			{
				nbBlock = (szData + 15) >> 4;
				lastLen = (szData & 0xf) ? (szData & 0xf) : 16;
				if (nbBlock <= 2 || kull_m_crypto_aesBlockEncryptDecrypt(hKey, data, nbBlock - 2, FALSE))
				{
					ptr = &data[16 * (nbBlock - 2)];
					RtlCopyMemory(buffer, ptr, lastLen + 16);
					RtlZeroMemory(&buffer[lastLen + 16], 16 - lastLen);
					if(kull_m_crypto_aesBlockEncryptDecrypt(hKeyNoIV, buffer, 1, FALSE))
					{
						for(i = 0; i < 16; i++)
							buffer[i] ^= buffer[i + 16];
						RtlCopyMemory(&buffer[lastLen + 16], &buffer[lastLen], 16 - lastLen);
						if(status = kull_m_crypto_aesBlockEncryptDecrypt(hKey, buffer + 16, 1, FALSE))
						{
							RtlCopyMemory(ptr, buffer + 16, 16);
							RtlCopyMemory(&data[16 * nbBlock - 16], buffer, lastLen);
						}
					}
				}
			}
			CryptDestroyKey(hKeyNoIV);
		}
	}