AES加密之openssl安装

合集下载

linu中aes对字段加密解密方法

linu中aes对字段加密解密方法

linu中aes对字段加密解密方法
在Linux中,你可以使用OpenSSL库来实现AES加密和解密。

下面是一个简单的示例,演示了如何使用OpenSSL进行AES加密和解密。

首先,确保你已经安装了OpenSSL库。

在大多数Linux发行版中,你可以使用包管理器来安装它。

例如,在Ubuntu上,你可以使用以下命令安装OpenSSL:
```shell
sudo apt-get install openssl
```
接下来,你可以使用以下命令进行AES加密和解密:
加密:
```shell
echo "待加密的文本" openssl enc -aes-256-cbc -salt -in /dev/stdin -out
```
解密:
```shell
openssl enc -d -aes-256-cbc -in -out
```
这些命令使用AES-256-CBC加密算法,你可以根据需要选择其他加密算法。

在加密命令中,`-salt`选项用于添加盐值,以提高安全性。

`-in /dev/stdin`选项指定输入来自标准输入,`-out `选项指定输出到名为``的文件中。

解密命令与加密命令类似,只是不需要`-salt`选项。

`-d`选项表示解密操作。

解密命令会将加密的输出文件(``)解密为明文输出到名为``的文件中。

请注意,这只是一个简单的示例,你可以根据实际需求进行更多的定制和配置。

还可以查看OpenSSL的文档以获取更多关于AES加密和解密的详细信息。

openssl操作手册

openssl操作手册

OpenSSL 是一个开源的加密库,提供了各种加密算法、数字证书、SSL/TLS 协议等功能,被广泛用于网络安全和加密通信领域。

以下是OpenSSL 的一些常见用法和操作:1. 生成证书:使用OpenSSL 可以生成各种类型的数字证书,包括自签名证书、CA 证书、服务器证书、客户端证书等。

您可以使用OpenSSL 提供的命令行工具或API 接口来生成证书。

2. 加密和解密:OpenSSL 提供了各种加密算法,包括对称加密和非对称加密。

您可以使用OpenSSL 提供的命令行工具或API 接口来进行加密和解密操作。

3. 签名和验证:OpenSSL 提供了数字签名和验证的功能,可以用于保证数据的完整性和真实性。

您可以使用OpenSSL 提供的命令行工具或API 接口来进行签名和验证操作。

4. SSL/TLS 安全通信:OpenSSL 提供了SSL/TLS 协议的实现,可以用于安全通信。

您可以使用OpenSSL 提供的命令行工具或API 接口来实现SSL/TLS 安全通信。

5. 网络安全工具:OpenSSL 提供了各种网络安全工具,包括OpenSSL s_server、OpenSSL s_client、OpenSSL speed、OpenSSL rand 等。

这些工具可以用于测试和评估网络安全性能。

要使用OpenSSL,您需要安装OpenSSL 库,并包含相应的头文件。

在编写代码时,您可以调用OpenSSL 提供的函数和数据结构来实现您需要的加密、签名、SSL/TLS 安全通信等功能。

OpenSSL 提供了详细的文档和使用手册,您可以在OpenSSL 官方网站上找到完整的文档和参考手册。

在文档中,您可以找到各种函数的使用说明、示例代码和详细的接口说明,以帮助您更好地使用OpenSSL 库。

openssl enc 用法

openssl enc 用法

openssl enc 用法OpenSSL enc 是一个功能强大的命令行工具,它可以用于加密和解密文件,支持多种加密算法和密码学参数。

在本文中,我将介绍 OpenSSL enc 的基本用法,以及如何使用它来进行文件加密和解密操作。

首先,我们需要确保OpenSSL 工具已经安装在我们的系统上。

如果没有安装,可以通过在终端中运行适用于您的操作系统的安装命令来安装 OpenSSL。

要使用 OpenSSL enc 进行文件加密,可以使用以下命令:openssl enc -<加密算法> -in <输入文件名> -out <输出文件名> -k <加密密钥>在上述命令中,<加密算法> 是指您希望使用的加密算法,例如 aes-256-cbc。

-in 参数用于指定输入文件名,-out 参数用于指定输出文件名,而 -k 参数是用于加密的密钥。

请记住,密钥的保密性是确保加密安全性的关键。

例如,如果我们想要使用 aes-256-cbc 算法将名为input.txt的文件加密,并将加密结果保存为output.txt,可以运行以下命令:openssl enc -aes-256-cbc -in input.txt -out output.txt -k mypassphrase在加密过程中,我们需要输入加密密钥的密码短语(即在 -k 参数后的mypassphrase),然后输入文件将被加密并保存为指定的输出文件名。

要解密一个加密文件,我们可以使用以下命令:openssl enc -<加密算法> -d -in <输入文件名> -out <输出文件名> -k <解密密钥> -<加密算法> 和 -k 参数的使用与加密命令相同。

但是,在解密命令中,我们需要使用 -d 参数来指示 OpenSSL enc 进行解密操作。

C代码使用openssl库实现AES-128-CBC-PKCS5padding加密解密

C代码使用openssl库实现AES-128-CBC-PKCS5padding加密解密

C代码使⽤openssl库实现AES-128-CBC-PKCS5padding加密解密刚刚帮⼩伙伴实现了这个(已经和java对接正常),貌似⽹上没有好⽤的C实现,贴到这⾥吧,希望可以帮助到有需要的⼈。

<code>#include <openssl/aes.h>#include <openssl/evp.h>#include <openssl/err.h>#include <openssl/bio.h>#include <openssl/buffer.h>char * base64Encode(const char *buffer, int length, int newLine);char * base64Decode(char *input, int length, int newLine);void handleOpenSSLErrors(void){unsigned long errCode;printf("An error occurred\n");while(errCode = ERR_get_error()) {char *err = ERR_error_string(errCode, NULL);printf("%s\n", err);}//abort();}/* AES_CBC_PKCS5_BASE64_Encrypt* ⼊参:* src:明⽂* srcLen:明⽂长度* key:密钥 长度只能是16/24/32字节 否则OPENSSL会对key进⾏截取或PKCS0填充* keyLen:密钥长度* outLen:密⽂base64后长度* 返回值: 密⽂base64后的字符串,使⽤后请free//todo:EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc() ...中的EVP_aes_128_cbc ⽬前硬编码后续可以优化*/#define AES_BLOCK_SIZE 16unsigned char *AES_CBC_PKCS5_BASE64_Encrypt(unsigned char *src, int srcLen, unsigned char *key, int keyLen, int*outLen, unsigned char *iv){EVP_CIPHER_CTX *ctx = NULL;char * res = NULL;int blockCount = 0;int quotient = srcLen / AES_BLOCK_SIZE;int mod = srcLen % AES_BLOCK_SIZE;blockCount = quotient + 1;int padding = AES_BLOCK_SIZE - mod;char *in = (char *)malloc(AES_BLOCK_SIZE*blockCount);memset(in, padding, AES_BLOCK_SIZE*blockCount);memcpy(in, src, srcLen);//outchar *out = (char *)malloc(AES_BLOCK_SIZE*blockCount);memset(out, 0x00, AES_BLOCK_SIZE*blockCount);*outLen = AES_BLOCK_SIZE*blockCount;do {if(!(ctx = EVP_CIPHER_CTX_new())) {handleOpenSSLErrors();break;}if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) {handleOpenSSLErrors();break;}if(1 != EVP_EncryptUpdate(ctx, (unsigned char*)out, outLen, in, AES_BLOCK_SIZE*blockCount)) {handleOpenSSLErrors();break;}res = base64Encode(out, *outLen, 0);}while(0);free(in);free(out);if (ctx != NULL)EVP_CIPHER_CTX_free(ctx);return (unsigned char*)res;}/* AES_CBC_PKCS5_Decrypt* ⼊参:* src:base64编码后的密⽂* srcLen:密⽂长度* key:密钥 长度只能是16/24/32字节 否则OPENSSL会对key进⾏截取或PKCS0填充* keyLen:密钥长度* outLen:明⽂长度* 返回值: 明⽂ 需要free*/unsigned char *AES_CBC_PKCS5_BASE64_Decrypt(unsigned char *src, int srcLen, unsigned char *key, int keyLen, int *outLen, unsigned char *iv){EVP_CIPHER_CTX *ctx = NULL;char *in = base64Decode(src, srcLen, 0);char *out = (char*)malloc(srcLen);do {/* Create and initialise the context */if(!(ctx = EVP_CIPHER_CTX_new())) {handleOpenSSLErrors();break;}/* Initialise the encryption operation. IMPORTANT - ensure you use a key* and IV size appropriate for your cipher* In this example we are using 256 bit AES (i.e. a 256 bit key). The* IV size for *most* modes is the same as the block size. For AES this* is 128 bits */if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) {handleOpenSSLErrors();break;}if(1 != EVP_DecryptUpdate(ctx, out, outLen, in, srcLen*3/4)) {handleOpenSSLErrors();break;}}while(0);free(in);if (ctx != NULL)EVP_CIPHER_CTX_free(ctx);//PKCS5 UNPADDINGint unpadding = out[*outLen - 1];*outLen = *outLen - unpadding;out[*outLen] = '\0';return (unsigned char*)out;}int main(int argc, char *argv[]){int outLen = 0;char *res = AES_CBC_PKCS5_BASE64_Encrypt(argv[1], strlen(argv[1]), "7854156156611111", 16, &outLen, "0000000000000000");printf("the result[%s]\r\n", res);char *res2 = AES_CBC_PKCS5_BASE64_Decrypt(res, strlen(res), "7854156156611111", 16, &outLen, "0000000000000000");printf("the org[%s] \r\n", res2);}// base64 编码char * base64Encode(const char *buffer, int length, int newLine){BIO *bmem = NULL;BIO *b64 = NULL;BUF_MEM *bptr;b64 = BIO_new(BIO_f_base64());if (!newLine) {BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);}bmem = BIO_new(BIO_s_mem());b64 = BIO_push(b64, bmem);BIO_write(b64, buffer, length);BIO_flush(b64);BIO_get_mem_ptr(b64, &bptr);BIO_set_close(b64, BIO_NOCLOSE);char *buff = (char *)malloc(bptr->length + 1);memcpy(buff, bptr->data, bptr->length);buff[bptr->length] = 0;BIO_free_all(b64);return buff;}// base64 解码char * base64Decode(char *input, int length, int newLine){BIO *b64 = NULL;BIO *bmem = NULL;char *buffer = (char *)malloc(length);memset(buffer, 0, length);b64 = BIO_new(BIO_f_base64());if (!newLine) {BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);}bmem = BIO_new_mem_buf(input, length);bmem = BIO_push(b64, bmem);BIO_read(bmem, buffer, length);BIO_free_all(bmem);return buffer;}</code>同时贴下java的版本:<code>import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;public class Main {public static String encrypt(String key, String initVector, String value) {try {IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);byte[] encrypted = cipher.doFinal(value.getBytes());System.out.println("encrypted string: " + Base64.getEncoder().encodeToString(encrypted));return Base64.getEncoder().encodeToString(encrypted);} catch (Exception ex) {ex.printStackTrace();}return null;}public static String decrypt(String key, String initVector, String encrypted) {try {IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted));return new String(original);} catch (Exception ex) {ex.printStackTrace();}return null;}public static void main(String[] args) {String key = "7854156156611111";String initVector = "0000000000000000"; // 16 bytes IVSystem.out.println(decrypt(key, initVector, encrypt(key, initVector,"test1111111111111111111111111111111111111111111111111111111111lkjflajfldkjasldfkjalhzlclz1xxxxxxxxxxxxxxxxxx"}}</code>golang的版本:<code>package mainimport ("bytes""crypto/aes""crypto/cipher""encoding/base64""fmt")const (key = "7854156156611111"iv = "0000000000000000")func main() {str := "test1234"es, _ := AesEncrypt(str, []byte(key))fmt.Println(es)ds, _ := AesDecrypt(es, []byte(key))fmt.Println(string(ds))}func AesEncrypt(encodeStr string, key []byte) (string, error) {encodeBytes := []byte(encodeStr)//根据key ⽣成密⽂block, err := aes.NewCipher(key)if err != nil {return "", err}blockSize := block.BlockSize()encodeBytes = PKCS5Padding(encodeBytes, blockSize)blockMode := cipher.NewCBCEncrypter(block, []byte(iv))crypted := make([]byte, len(encodeBytes))blockMode.CryptBlocks(crypted, encodeBytes)return base64.StdEncoding.EncodeToString(crypted), nil}func PKCS5Padding(ciphertext []byte, blockSize int) []byte {padding := blockSize - len(ciphertext)%blockSize//填充padtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(ciphertext, padtext...)}func AesDecrypt(decodeStr string, key []byte) ([]byte, error) {//先解密base64decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr) if err != nil {return nil, err}block, err := aes.NewCipher(key)if err != nil {return nil, err}blockMode := cipher.NewCBCDecrypter(block, []byte(iv))origData := make([]byte, len(decodeBytes))blockMode.CryptBlocks(origData, decodeBytes)origData = PKCS5UnPadding(origData)return origData, nil}func PKCS5UnPadding(origData []byte) []byte {length := len(origData)unpadding := int(origData[length-1])return origData[:(length - unpadding)]}</code>。

Mac命令行数据加密技巧使用openssl和gnupg加密和解密数据

Mac命令行数据加密技巧使用openssl和gnupg加密和解密数据

Mac命令行数据加密技巧使用openssl和gnupg加密和解密数据数据加密在信息安全中起着至关重要的作用。

在Mac操作系统中,我们可以利用命令行工具openssl和gnupg来实现数据的加密和解密。

本文将介绍如何在Mac命令行下使用这两种工具进行数据的加密和解密。

一、使用openssl加密和解密数据openssl是一个开放源代码的软件库,提供了很多用于安全通信的密码学功能。

下面将介绍如何使用openssl进行数据的加密和解密。

1. 安装openssl首先,我们需要在Mac上安装openssl。

打开终端,并输入以下命令:```brew install openssl```等待安装完成后,我们就可以使用openssl了。

2. 加密数据要加密数据,我们需要使用openssl的enc命令。

假设我们有一个名为example.txt的文件,我们可以使用以下命令将其加密:```openssl enc -aes-256-cbc -salt -in example.txt -out example.txt.enc```此命令使用256位的高级加密标准(AES-256)和密码块链接模式(CBC)对文件进行加密,并将加密后的结果保存为example.txt.enc。

在执行上述命令时,openssl会要求您输入加密密码。

请记住您输入的密码,因为它将用于解密数据。

3. 解密数据要解密数据,我们使用与加密相同的enc命令,只需将其输入和输出参数进行交换即可:```openssl enc -d -aes-256-cbc -in example.txt.enc -out example.txt.dec```此命令将example.txt.enc文件解密为example.txt.dec。

解密过程中需要输入之前设置的密码才能成功解密。

二、使用gnupg加密和解密数据gnupg是GNU隐私保护协议的缩写,它是一个用于加密和签名数据的免费软件。

利用OpenSSL库对Socket传输进行安全加密(RSA+AES)

利用OpenSSL库对Socket传输进行安全加密(RSA+AES)

利⽤OpenSSL库对Socket传输进⾏安全加密(RSA+AES)轉⾃:/uid-9543173-id-3921143.html利⽤OpenSSL库对Socket传输进⾏安全加密(RSA+AES)1. 利⽤RSA安全传输AES⽣成密钥所需的Seed(32字节)2. 利⽤AES_encrypt/AES_decrypt对Socket上⾯的业务数据进⾏AES加密/解密理论上只需要AES就能保证全部流程,但由于AES加密所需要的AES-KEY是⼀个结构。

这个⼀个结构,如果通过⽹络进⾏传输,就需要对它进⾏⽹络编码,OpenSSL⾥⾯没有现成的API所以就引⼊RSA来完成⾸次安全的传输,保证Seed不会被窃听。

同样,只使⽤RSA也能完成全部流程,但由于RSA的处理效率⽐AES低,所以在业务数据传输加密上还是使⽤AES下⾯的代码包含了上述传输加密流程所需的所有步骤(OpenSSL部分)在实际的Socket应⽤开发时,需要将这些步骤插⼊到Client/Server⽹络通信的特定阶段所需的OpenSSL主要的API及功能描述1. RSA_generate_key() 随机⽣成⼀个RSA密钥对,供RSA加密/解密使⽤2. i2d_RSAPublicKey() 将RSA密钥对⾥⾯的公钥提出到⼀个BUF,⽤于⽹络传输给对⽅3. d2i_RSAPublicKey() 将从⽹络传过来的公钥信息⽣成⼀个加密使⽤的RSA(它⾥⾯只有公钥)4. RSA_public_encrypt() 使⽤RSA的公钥对数据进⾏加密5. RSA_private_decrypt() 使⽤RSA的私钥对数据进⾏解密6. AES_set_encrypt_key() 根据Seed⽣成AES密钥对中的加密密钥7. AES_set_decrypt_key() 根据Seed⽣成AES密钥对中的解密密钥8. AES_encrypt() 使⽤AES加密密钥对数据进⾏加密9. AES_decrypt() 使⽤AES解密密钥对数据进⾏解密⼀个典型的安全Socket的建⽴流程, 其实就是如何将Server随机Seed安全发给ClientC: Client S:ServerC: RSA_generate_key() --> RSAKey --> i2d_RSAPublicKey(RSAKey) --> RSAPublicKeyC: Send(RSAPublicKey) TO ServerS: Recv() --> RSAPublicKey --> d2i_RSAPublicKey(RSAPublicKey) --> RSAKeyS: Rand() --> Seed --> RSA_public_encrypt(RSAKey, Seed) --> EncryptedSeedS: Send(EncryptedSeed) TO ClientC: Recv() --> EncryptedSeed --> RSA_private_decrypt(RSAKey, EncryptedSeed) --> Seed--- 到此, Client和Server已经完成完成传输Seed的处理--- 后⾯的流程是它们怎样使⽤这个Seed来进⾏业务数据的安全传输C: AES_set_encrypt_key(Seed) --> AESEncryptKeyC: AES_set_decrypt_key(Seed) --> AESDecryptKeyS: AES_set_encrypt_key(Seed) --> AESEncryptKeyS: AES_set_decrypt_key(Seed) --> AESDecryptKey--- Client传输数据给ServerC: AES_encrypt(AESEncryptKey, Data) --> EncryptedData --> Send() --> ServerS: Recv() --> EncryptedData --> AES_decrypt(AESDecryptKey, EncryptedData) --> Data--- Server传输数据给ClientS: AES_encrypt(AESEncryptKey, Data) --> EncryptedData --> Send() --> ClientC: Recv() --> EncryptedData --> AES_decrypt(AESDecryptKey, EncryptedData) --> Data流程图如下:相关的代码实现如下:#include <string.h>#include <openssl/rsa.h>#include <openssl/aes.h>int main(){// 1. 产⽣RSA密钥对// 产⽣512字节公钥指数为RSA_F4的密钥对,公钥指数有RSA_F4和RSA_3两种// 我不清楚它们的区别,就随便选定RSA_F4// 可以使⽤RSA_print_fp()看看RSA⾥⾯的东西RSA *ClientRsa = RSA_generate_key(512, RSA_F4, NULL, NULL);// ---------// 2. 从RSA结构中提取公钥到BUFF,以便将它传输给对⽅// 512位的RSA其公钥提出出来长度是74字节,⽽私钥提取出来有超过300字节// 为保险起见,建议给它们预留⼀个512字节的空间unsigned char PublicKey[512];unsigned char *PKey = PublicKey; // 注意这个指针不是多余,是特意要这样做的,int PublicKeyLen = i2d_RSAPublicKey(ClientRsa, &PKey);// 不能采⽤下⾯的⽅法,因为i2d_RSAPublicKey()会修改PublicKey的值// 所以要引⼊PKey,让它作为替死⿁// unsigned char *PublicKey = (unsigned char *)malloc(512);// int PublicKeyLen = i2d_RSAPublicKey(ClientRsa, &PublicKey);// 逐个字节打印PublicKey信息printf("PublicKeyBuff, Len=%d\n", PublicKeyLen);for (int i=0; i<PublicKeyLen; i++){printf("0x%02x, ", *(PublicKey+i));}printf("\n");// ---------// 3. 跟据上⾯提出的公钥信息PublicKey构造⼀个新RSA密钥(这个密钥结构只有公钥信息)PKey = PublicKey;RSA *EncryptRsa = d2i_RSAPublicKey(NULL, (const unsigned char**)&PKey, PublicKeyLen);// ---------// 4. 使⽤EncryptRsa加密数据,再使⽤ClientRsa解密数据// 注意, RSA加密/解密的数据长度是有限制,例如512位的RSA就只能最多能加密解密64字节的数据// 如果采⽤RSA_NO_PADDING加密⽅式,512位的RSA就只能加密长度等于64的数据// 这个长度可以使⽤RSA_size()来获得unsigned char InBuff[64], OutBuff[64];strcpy((char *)InBuff, "1234567890abcdefghiklmnopqrstuvwxyz.");RSA_public_encrypt(64, (const unsigned char*)InBuff, OutBuff, EncryptRsa, RSA_NO_PADDING); // 加密 memset(InBuff, 0, sizeof(InBuff));RSA_private_decrypt(64, (const unsigned char*)OutBuff, InBuff, ClientRsa, RSA_NO_PADDING); // 解密 printf("RSADecrypt OK: %s \n", InBuff);// ----------// 5. 利⽤随机32字节Seed来产⽣256位的AES密钥对unsigned char Seed[32]; // 可以采⽤Rand()等⽅法来构造随机信息AES_KEY AESEncryptKey, AESDecryptKey;AES_set_encrypt_key(Seed, 256, &AESEncryptKey);AES_set_decrypt_key(Seed, 256, &AESDecryptKey);// ----------// 6. 使⽤AES密钥对来加密/解密数据// 注意,256位的AES密钥只能加密/解密16字节长的数据strcpy((char *)InBuff, "a1b2c3d4e5f6g7h8?");AES_encrypt(InBuff, OutBuff, &AESEncryptKey);memset(InBuff, 0, sizeof(InBuff));AES_decrypt(OutBuff, InBuff, &AESDecryptKey);printf("AESDecrypt OK: %s \n", InBuff);// ----------// 7. 谨记要释放RSA结构RSA_free(ClientRsa);RSA_free(EncryptRsa);return(0);}。

openssl3 手册

openssl3 手册

openssl3 手册OpenSSL 3 手册第一章:介绍OpenSSL 3 是一套开放源代码的安全套接字层密码库,提供了一系列用于安全通信的加密算法和协议实现。

本手册将为您详细介绍OpenSSL 3 的功能、用法和配置。

第二章:安装在开始使用 OpenSSL 3 之前,您需要先安装它。

以下是安装OpenSSL 3 的步骤:1. 下载 OpenSSL 3 的最新版本压缩包,并解压到您的计算机上。

2. 打开终端或命令提示符,进入解压后的 OpenSSL 3 目录。

3. 执行以下命令编译和安装 OpenSSL 3:```./configmakemake install```第三章:常用命令OpenSSL 3 提供了丰富的命令行工具,用于执行各种任务,包括生成证书、加密文件和检查数字签名等。

以下是一些常用的命令及其用法:1. 生成自签名证书:```openssl req -newkey rsa:2048 -nodes -keyout privateKey.key -x509 -days 365 -out certificate.crt```该命令将生成一个私钥和自签名证书,有效期为 365 天。

2. 加密文件:```openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.txt```上述命令将使用AES-256-CBC 加密算法对plaintext.txt 进行加密,并将加密后的结果保存到 encrypted.txt。

3. 创建数字签名:```openssl dgst -sha256 -sign privateKey.key -out signature.bin data.txt```该命令将使用 SHA-256 算法对 data.txt 进行哈希,并使用私钥对哈希值进行签名,生成 signature.bin。

4. 验证数字签名:```openssl dgst -sha256 -verify certificate.crt -signature signature.bin data.txt```上述命令将使用公钥证书验证 signature.bin 是否为 data.txt 的有效签名。

详解Linux(centos7)下安装OpenSSL安装图文方法

详解Linux(centos7)下安装OpenSSL安装图文方法

详解Linux(centos7)下安装OpenSSL安装图⽂⽅法OpenSSL是⼀个开源的ssl技术,由于我需要使⽤php相关功能,需要获取https的⽂件所以必须安装这个东西了,下⾯我整理了两种关于OpenSSL安装配置⽅法。

安装环境:操作系统:CentOs7安静OpenSSL Version:openssl-1.0.2j.tar.gz1、将下载的压缩包放在根⽬录,2、在⽂件夹下解压缩,命令:tar -xzf openssl-1.0.2j.tar.gz,得到openssl-1.0.2j⽂件夹3、进⼊解压的⽬录:cd openssl-1.0.2j4、设定Openssl 安装,( --prefix )参数为欲安装之⽬录,也就是安装后的档案会出现在该⽬录下:执⾏命令: ./config --prefix=/usr/local/openssl5、执⾏命令./config -t6.执⾏make,编译Openssl这⾥如果出现如下错误make[1]: gcc: Command not found⽣⽓上⽹查才发现我安装的CentOS7中没有GCC编译器保证系统⽹络畅通以后,执⾏命令 yum -y install gcc 安装GCC(注意,⼀定要忘了顺畅,不然安装不了)7、安装 Openssl:make install8、执⾏以下命令[root@localhost /]# cd /usr/local[root@localhost local]# ldd /usr/local/openssl/bin/openssl会出现类似如下信息:9、查看路径...]# which openssl查看版本...]# openssl version卸载旧版本 OpenSSL的⽅法apt-get purge opensslrm -rf /etc/ssl #删除配置⽂件以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AES加密之openssl安装linux下的安装1)解压openssl 开发包文件;2)运行./config --prefix=/usr/local/openssl (更多选项用./config --help 来查看),可用的选项有:no-mdc2、no-cast no-rc2、no-rc5、no-ripemd、no-rc4 no-des 、no-md2、no-md4、no-idea 、no-aes、no-bf、no-err、no-dsa、no-dh、no-ec、no-hw、no-asm、no-krb5、no-dso 、no-threads 、no-zlib、DOPENSSL_NO_HASH_COMP、-DOPENSSL_NO_ERR、-DOPENSSL_NO_HW 、-DOPENSSL_NO_OCSP、-DOPENSSL_NO_SHA256 和-DOPENSSL_NO_SHA512 等。

去掉不必要的内容可以减少生成库的大小。

若要生成debug 版本的库和可执行程序加-g 或者-g3(openssl 中有很多宏,需要调试学习最好加上-g3)。

3)make test (可选)4)make install完成后,openssl 会被安装到/usr/local/openssl 目录,包括头文件目录include、可执行文件目录bin、man 在线帮助、库目录lib 以及配置文件目录(ssl)。

——————————————网摘—————————————————————window编译与安装本文介绍在VC 中编译和使用OpenSSL的过程。

一、编译OpenSSL在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。

下载最新版本的Perl:/ActivePerl/Windows/5.8/ActivePerl-5.8.8.822-MSWin32 -x86-280952.zip。

然后安装之。

下载最新版本的OpenSSL:/source/openssl-0.9.8g.tar.gz然后将源码释放的c:\openssl-0.9.8g目录中。

进入openssl源码目录。

cd c:\openssl-0.9.8.g以下为参照该目录下的文件INSTALL.W32的执行过程:运行configure:perl Configure VC-WIN32 --prefix=c:/openssl创建Makefile文件:ms\do_ms编译动态库:nmake -f ms\ntdll.mak编译静态库:nmake -f ms\nt.mak测试动态库:nmake -f ms\ntdll.mak test测试静态库:nmake -f ms\nt.mak test安装动态库:nmake -f ms\ntdll.mak install安装静态库:nmake -f ms\nt.mak install清除上次动态库的编译,以便重新编译:nmake -f ms\ntdll.mak clean清除上次静态库的编译,以便重新编译:nmake -f ms\nt.mak clean二、使用OpenSSL在VC中配置使用以上的函数库:点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。

在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include";"Library files"选择中新增目录"C:\openssl\lib"。

然后在需要链接OpenSSL函数库的工程中编译时加入"libeay32.lib"就可以了。

三、问题我在链接OpenSSL的静态函数库时遇到类似以下的问题:Linking...msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj) ...这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。

调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下:编辑文件ms\nt.mak,将该文件第19行"CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo-DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN-DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE-D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA-DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2-DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5-DOPENSSL_NO_DYNAMIC_ENGINE"中的"/MD"修改为"/MT"。

然后重新编译安装OpenSSL即可。

四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明《在VC中对C/C++ 运行时库不同版本编译指令说明》(/271/dgkang/1737771.shtml)一文中详细介绍了连接不同版本库的编译指令如下:C Runtime Library:/MD MSVCRT.LIB 多线程DLL的Release版本/MDd MSVCRTD.LIB 多线程DLL的Debug版本/MT LIBCMT.LIB 多线程静态链接的Release版本/MTd LIBCMTD.LIB 多线程静态链接的Debug版本/clr MSVCMRT.LIB 托管代码和非托管代码混合/clr:pure MSVCURT.LIB 纯托管代码C++ Standard Library:/MD MSVCPRT.LIB 多线程DLL的Release版本/MDd MSVCPRTD.LIB 多线程DLL的Debug版本/MT LIBCPMT.LIB 多线程静态链接的Release版本/MTd LIBCPMTD.LIB 多线程静态链接的Debug版本linux下使用[cpp]view plaincopy1.#include <stdio.h>2.#include <string.h>3.#include <stdlib.h>4.#include <openssl/aes.h>5.6.void aes_box_encrypt(unsigned char* source_string, unsigned char* des_string)7.{8.int iLoop = 0;9.int iLen =0;10. AES_KEY aes;11. unsigned char key[AES_BLOCK_SIZE];12. unsigned char iv[AES_BLOCK_SIZE];13.if(NULL == source_string || NULL == des_string)14. {15.return;16. }17.18.//Generate own AES Key19.for(iLoop = 0; iLoop < 16; iLoop++)20. {21. key[iLoop] = 32 + iLoop;22. }23.24.// Set encryption key25.for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)26. {27. iv[iLoop] = 0;28. }29.30.if (AES_set_encrypt_key(key, 128, &aes) < 0)31. {32.return ;33. }34.35. iLen = strlen(source_string) + 1;36.37. AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_ENCRYPT);38.39.}40.41.void aes_box_decrypt(unsigned char* source_string, unsigned char* des_string)42.{43.int iLoop = 0;44.int iLen =0;45. AES_KEY aes;46. unsigned char key[AES_BLOCK_SIZE];47. unsigned char iv[AES_BLOCK_SIZE];48.if(NULL == source_string || NULL == des_string)49. {50.return;51. }52.53.//Generate own AES Key54.for(iLoop = 0; iLoop < 16; iLoop++)55. {56. key[iLoop] = 32 + iLoop;57. }58.59.// Set encryption key60.for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)61. {62. iv[iLoop] = 0;63. }64.65.if (AES_set_decrypt_key(key, 128, &aes) < 0)66. {67.return ;68. }69.70. iLen = strlen(source_string)+1;71.72. AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_DECRYPT);73.}74.75.int main(int argc,char *argv[])76.{77. unsigned char ucIsEncrypt = 3;78. unsigned char sourceStringTemp[16];79. unsigned char dstStringTemp[16];80.81. memset(sourceStringTemp, 0 ,16);82.83. strcpy((char*)sourceStringTemp, argv[1]);84. ucIsEncrypt = atoi(argv[2]);85.86.if(AES_ENCRYPT == ucIsEncrypt)87. {88. aes_box_encrypt(sourceStringTemp,dstStringTemp);89. }90.else if(AES_DECRYPT == ucIsEncrypt)91. {92. aes_box_decrypt(sourceStringTemp,dstStringTemp);93. }94.95. printf("%s",dstStringTemp);96.97.return 0;98.}makefile[plain]view plaincopy1.SERVER = AESPassword2.TARGET = ${SERVER}3.4.WORK_DIR = $(shell pwd)5.#tsp_root = $(shell pwd)/../../6.TARGET_DIR=${WORK_DIR}7.#HISISDK_DIR=${WORK_DIR}/../../../../../../8.9.OBJECTS = AESPassword.o10.=gcc12.13.LIB_PATH = -L${WORK_DIR}/dst/lib14.15.CFLAGS = -Wall -g16.17.LIBS = -lcrypto18.19.INCLUDE_PATH = -I${WORK_DIR}/dst/include20.21.22.VPATH =23.24.25..PHNOY: all26.all: ${TARGET} clean_obj27.obj: ${OBJECTS}28.29.${SERVER}: ${OBJECTS}30. ${CC} -o ${TARGET_DIR}/${SERVER} ${OBJECTS} ${LIB_PATH} ${LIBS} ${CFLAGS}31.32.%.o:%.c33. ${CC} ${CFLAGS} -c $< ${INCLUDE_PATH}34.35.36.#.PHNOY : clean37.clean_obj:38. -rm ${OBJECTS}39.clean:40. -rm -rf ${TARGET_DIR}/${SERVER} ${OBJECTS}window下使用[cpp]view plaincopy1.#include <stdio.h>2.#include <string.h>3.#include <stdlib.h>4.#include "openssl/aes.h"5.#pragma comment(lib, "4758cca.lib")6.#pragma comment(lib, "aep.lib")7.#pragma comment(lib, "atalla.lib")8.#pragma comment(lib, "4758cca.lib")9.#pragma comment(lib, "chil.lib")10.#pragma comment(lib, "capi.lib")11.#pragma comment(lib, "cswift.lib")12.#pragma comment(lib, "gmp.lib")13.#pragma comment(lib, "libeay32.lib")14.#pragma comment(lib, "nuron.lib")15.#pragma comment(lib, "padlock.lib")16.#pragma comment(lib, "ssleay32.lib")17.#pragma comment(lib, "gost.lib")18.#pragma comment(lib, "sureware.lib")19.#pragma comment(lib, "ubsec.lib")20.21.22.void aes_box_encrypt(unsigned char* source_string, unsigned char* des_string)23.{24.int iLoop = 0;25.int iLen =0;26. AES_KEY aes;27. unsigned char key[AES_BLOCK_SIZE];28. unsigned char iv[AES_BLOCK_SIZE];29.if(NULL == source_string || NULL == des_string)30. {31.return;32. }33.34.//Generate own AES Key35.for(iLoop = 0; iLoop < 16; iLoop++)36. {37. key[iLoop] = 32 + iLoop;38. }39.40.// Set encryption key41.for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)42. {43. iv[iLoop] = 0;44. }45.46.if (AES_set_encrypt_key(key, 128, &aes) < 0)47. {48.return ;49. }50.51. iLen = strlen(source_string)+1;52.53. AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_ENCRYPT);54.55.}56.57.void aes_box_decrypt(unsigned char* source_string, unsigned char* des_string)58.{59.int iLoop = 0;60.int iLen =0;61. AES_KEY aes;62. unsigned char key[AES_BLOCK_SIZE];63. unsigned char iv[AES_BLOCK_SIZE];64.if(NULL == source_string || NULL == des_string)65. {66.return;67. }68.69.//Generate own AES Key70.for(iLoop = 0; iLoop < 16; iLoop++)71. {72. key[iLoop] = 32 + iLoop;73. }74.75.// Set encryption key76.for (iLoop=0; iLoop<AES_BLOCK_SIZE; iLoop++)77. {78. iv[iLoop] = 0;79. }80.81.if (AES_set_decrypt_key(key, 128, &aes) < 0)82. {83.return ;84. }85.86. iLen = strlen(source_string)+1;87.88. AES_cbc_encrypt(source_string, des_string, iLen, &aes, iv, AES_DECRYPT);89.}90.91.int main(void)92.{93.// unsigned char ucIsEncrypt = 3;94.// unsigned char sourceStringTemp[16];95.// unsigned char dstStringTemp[16];96.97.// memset(sourceStringTemp, 0 ,16);98.//99.//if (NULL == argv[1])100.//{101.// return 0;102.//}103.104.// strcpy((char*)sourceStringTemp, argv[1]);105.// ucIsEncrypt = atoi(argv[2]);106.107.// if(AES_ENCRYPT == ucIsEncrypt)108.// {109.// aes_box_encrypt(sourceStringTemp,dstStringTemp);110.// }111.// else if(AES_DECRYPT == ucIsEncrypt)112.// {113.// aes_box_decrypt(sourceStringTemp,dstStringTemp);114.// }115.116.// printf("%s\r\n",dstStringTemp);117.118.119.char source[] = {"你好icd"};120.char dstStringTemp[16+1] = {0};121.char dst[16+1] = {0};122.123. aes_box_encrypt(source,dstStringTemp);124.125. printf("要加密的内容:%s\r\n", source);126. printf("加密后的内容:%s\r\n", dstStringTemp); 127.128. aes_box_decrypt(dstStringTemp, dst);129.130. printf("解密后的内容:%s\r\n", dst);131.132.// return 0;133.}。

相关文档
最新文档