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 #删除配置⽂件以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

AES算法加密C语言完整程序

AES算法加密C语言完整程序

AES算法加密C语言完整程序下面是一个使用AES算法加密的C语言完整程序。

这个程序将输入的字符串进行AES加密后输出加密结果。

```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <openssl/aes.h>//加密函数void encrypt_aes(const uint8_t *key, const uint8_t*plaintext, uint8_t *ciphertext)AES_KEY aes_key;AES_set_encrypt_key(key, 128, &aes_key); // 设置AES加密密钥AES_encrypt(plaintext, ciphertext, &aes_key); // 使用AES 加密函数加密明文int maichar plaintext[256];printf("请输入需要加密的字符串:");gets(plaintext);uint8_t ciphertext[256];size_t len = strlen((const char *)plaintext);int padding = 0;if (len % AES_BLOCK_SIZE != 0)padding = AES_BLOCK_SIZE - (len % AES_BLOCK_SIZE); // 填充长度}len += padding;//填充分组并加密uint8_t *padded_plaintext = (uint8_t *)calloc(len,sizeof(uint8_t));memcpy(padded_plaintext, plaintext, strlen((const char*)plaintext) + 1); // 拷贝明文到填充后的明文for (int i = 0; i < padding; i++)padded_plaintext[len - 1 - i] = (uint8_t)padding; // 填充值为填充长度}encrypt_aes((const uint8_t *)key, padded_plaintext, ciphertext); // 加密printf("加密后的结果为:");for (int i = 0; i < len; i++)printf("%02x", ciphertext[i]);}printf("\n");free(padded_plaintext);return 0;```此程序使用了OpenSSL库中的AES实现,因此需要先安装并配置好OpenSSL库。

openssl使用流程

openssl使用流程

openssl使用流程OpenSSL使用流程介绍OpenSSL 是一个开源的加密工具包和安全通信协议实现库,提供了一系列的加密算法、SSL/TLS 防护和各种安全工具,广泛应用于网络通信、服务器配置、数字证书管理等各个领域。

本文将以OpenSSL 的使用流程为主题,一步一步详细回答。

一、准备工作1. 下载和安装OpenSSL:首先,我们需要从OpenSSL 的官方网站或其他可信来源下载并安装OpenSSL。

根据操作系统的不同,选择相应的版本进行下载和安装。

2. 生成RSA 密钥对:在开始使用OpenSSL 之前,建议先生成一对RSA 密钥对,用于后续的加密和解密操作。

在命令行中输入以下命令可以生成一个2048 位的RSA 密钥对:openssl genrsa -out private.key 2048该命令将生成一个名为private.key 的私钥文件,其中包含了生成的RSA 私钥。

接着,可以使用以下命令生成对应的公钥文件:openssl rsa -in private.key -pubout -out public.key这将生成一个名为public.key 的公钥文件,其中包含了与私钥对应的RSA 公钥。

二、公钥加密和私钥解密1. 加密数据:使用公钥加密数据是一种常见的操作,可以保证数据在传输过程中的机密性。

在命令行中输入以下命令可以使用公钥对数据进行加密:openssl rsautl -encrypt -pubin -inkey public.key -in plaintext.txt -out ciphertext.enc该命令将使用public.key 中的公钥对plaintext.txt 中的明文数据进行加密,并将密文数据存储到ciphertext.enc 文件中。

2. 解密数据:解密数据需要使用对应的私钥进行操作。

在命令行中输入以下命令可以使用私钥对密文数据进行解密:openssl rsautl -decrypt -inkey private.key -in ciphertext.enc -out plaintext.txt该命令将使用private.key 中的私钥对ciphertext.enc 中的密文数据进行解密,并将解密后的明文数据存储到plaintext.txt 文件中。

open ssl aes用法

open ssl aes用法

标题:OpenSSL AES加密和解密用法详解1. 简介OpenSSL是一个强大的加密工具,提供了多种加密算法,其中包括AES(高级加密标准)。

AES是一种对称加密算法,能够提供高强度的数据加密和解密功能。

在本文中,我们将详细介绍如何使用OpenSSL来实现AES加密和解密。

2. 准备工作在使用OpenSSL进行AES加密和解密之前,需要确保已经安装了OpenSSL库,并且了解了基本的命令行操作。

还需要生成一个用于AES加密和解密的密钥和初始向量(IV)。

3. 生成密钥和初始向量在使用AES进行加密和解密时,需要一个密钥和一个初始向量。

可以使用OpenSSL的命令行工具来生成这些参数,比如可以使用以下命令来生成一个128位的随机密钥和一个随机的初始向量:```openssl rand -base64 16```上述命令会生成一个16字节(128位)的随机字符串作为密钥和初始向量。

可以将生成的密钥和初始向量保存在安全的地方,以便后续的加密和解密操作。

4. AES加密使用OpenSSL进行AES加密的命令如下:```openssl enc -aes-256-cbc -in input.txt -out encrypted.bin -pass pass:your_password -iv your_IV```其中,`-aes-256-cbc`表示使用AES算法进行加密,`-in`参数指定待加密的文件,`-out`参数指定加密后的输出文件,`-passpass:your_password`参数指定使用的密钥,`-iv`参数指定使用的初始向量。

5. AES解密使用OpenSSL进行AES解密的命令如下:```openssl enc -d -aes-256-cbc -in encrypted.bin -out decrypted.txt -pass pass:your_password -iv your_IV```其中,`-d`参数表示解密操作,其余参数与加密操作类似。

Linux系统安装OpenSSL两种方法

Linux系统安装OpenSSL两种方法

Linux系统安装OpenSSL两种⽅法⽅法⼀,编译安装OpenSSL准备⼯作:4.17.0-kali1-amd641.1、更新源:apt-get update (如果需要切换更新源可以查看kali Linux 更新源)升级源:apt-get upgrade 更新系统:apt-get dist-upgrade1.2、查看OpenSSL版本 4.17版本的kali系统已经安装了openssl 1.1.0hopenssl version -a1.3、安装基础编译环境 apt-get install build-essential1.4、编译安装zlib库 tar -zxf zlib-1.2.5.tar.gz cd zlib-1.2.5/ ./configure --prefix=/usr/local make && make install1.5、卸载旧版本OpenSSL apt-get purge openssl rm -rf /etc/ssl #删除配置⽂件1.6、编译安装OpenSSL (prefix 是安装⽬录,openssldir是配置⽂件⽬录,另外建议安装两次,shard作⽤是⽣成动态链接库) wget ftp:///source/openss-1.0.0c.tar.gz tar -zxv openssl-1.0.0c.tar.gz cd openssl-1.0.0c/ ./config --prefix=/usr/local --openssldir=/usr/local/ssl make && make install ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl make clean make && make install⽅法⼆: OpenSSL库的安装 去官⽹下载最新版本 tar -zxv openssl-1.0.2p.tar.gz cd openssl-1.0.2p/ ./config make && make install ./config shared make clean make && make install。

openssl使用方式

openssl使用方式

openssl使用方式
摘要:
1.OpenSSL 简介
2.OpenSSL 的使用方式
3.示例:使用OpenSSL 进行加密和解密
4.小结
正文:
OpenSSL 是一个安全套接字层(SSL)和传输层安全(TLS)协议的开源加密库,广泛应用于互联网的安全通信。

它支持多种加密算法、数字签名、证书管理等功能,为网络应用程序提供了安全的通信功能。

OpenSSL 的使用方式主要分为以下几个步骤:
1.安装OpenSSL 库:首先,你需要在你的计算机或服务器上安装OpenSSL 库。

在Linux 系统中,可以使用“sudo apt-get install openssl”命令进行安装。

在Windows 系统中,可以通过访问OpenSSL 官网下载相应版本的安装包进行安装。

2.配置OpenSSL:安装完成后,你需要对OpenSSL 进行配置,以便它能够正确地为你的应用程序提供服务。

配置过程包括设置加密算法、生成密钥和证书等。

具体的配置方法可以参考OpenSSL 的官方文档。

3.初始化OpenSSL:在应用程序中,你需要使用OpenSSL 的API 对SSL/TLS 连接进行初始化。

这一步通常包括创建一个SSL/TLS 上下文、初始化一个SSL/TLS 连接等。

4.加密和解密数据:在数据传输过程中,你需要使用OpenSSL 的API 对数据进行加密和解密。

加密过程中,你需要使用SSL/TLS 上下文和密钥对数据进行加密;解密过程中,你需要使用SSL/TLS 上下文和相应的私钥对数据进行解密。

openssl安装及使用图解

openssl安装及使用图解

Openssl安装及使用一软件Windows下需要用到的软件•C++编译器编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。

一个现代编译器的主要工作流程:源代码(source code) → 预处理器(preprocessor) → 编译器(compiler) → 汇编程序(assembler) → 目标代码(object code) → 链接器(Linker) → 可执行程序(executables)。

c++编译器是一个与标准化C++高度兼容的编译环境。

这点对于编译可移植的代码十分重要。

编译器对不同的CPU会进行不同的优化。

•ActivePerl一个perl脚本解释器。

其包含了包括有Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让你编写出适用于unix,windows,linux系统的CGI程序来。

安装的只是perl的一个解释程序啦,外观上也不会发生什么变化,你在windows的cmd界面里输入perl -v可查看你所安装的版本。

在你编译perl程序时会用到它。

法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

•MASM 8.0•MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。

它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使OpenSSLOpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,它还是一个多用途的、跨平台的密码工具。

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。

OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

实用密码库openssl简单编程实践

实用密码库openssl简单编程实践

实用密码库openssl简单编程实践一、概述在网络信息安全的应用中,密码学技术是一项非常重要的技术之一。

而openssl是一个强大的密码库,提供了多种密码学算法的实现,是开发安全网络应用的理想选择。

本文将介绍openssl密码库的简单编程实践,帮助读者快速上手使用openssl库进行密码学应用的开发。

二、概述openssl密码库1. openssl密码库简介openssl密码库是一个开源的密码库,提供了丰富的密码学算法的实现,包括对称加密算法、非对称加密算法、数字签名算法等。

它广泛应用于网络安全、加密通信、数字证书等领域,是当前最流行的密码库之一。

2. openssl密码库的特点- 开源免费:openssl密码库是一个开源项目,可以免费获取源代码进行使用和修改。

- 跨评台:openssl密码库支持多种操作系统,包括Linux、Windows、Mac等,可以在不同评台上进行应用开发。

- 支持多种密码算法:openssl密码库支持对称加密算法如AES、DES,非对称加密算法如RSA、ECC,以及数字签名算法如DSA、ECDSA 等,满足各种安全需求。

- 丰富的应用库:openssl密码库还提供了丰富的应用库,包括SSL/TLS协议实现、数字证书管理等,可以满足各种安全应用的开发需求。

三、openssl密码库的安装和配置1. openssl密码库的安装在Linux系统中,openssl密码库通常已经预装。

如果没有预装,可以通过包管理工具安装openssl库:```sudo apt-get install openssl```在Windows系统中,可以从openssl全球信息站下载对应版本的openssl库进行安装。

2. openssl密码库的配置安装完成后,需要配置openssl密码库的环境变量,以方便编程时调用openssl库中的函数和头文件。

在Linux系统中,可以将openssl库的路径添加到LD_LIBRARY_PATH环境变量中:```export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib```在Windows系统中,可以将openssl库的路径添加到环境变量中,在编译时指定openssl库的路径。

在Shell脚本中使用加密和解密的高级技巧

在Shell脚本中使用加密和解密的高级技巧

在Shell脚本中使用加密和解密的高级技巧Shell脚本是一种自动化处理任务的脚本语言,在实际应用中,我们常常需要处理敏感的数据信息。

为了保证数据的安全性,我们可以使用加密和解密的高级技巧。

本文将介绍在Shell脚本中使用加密和解密的方法和技巧。

一、使用openssl工具进行加密1. 安装openssl工具在Shell脚本中使用加密和解密功能,我们需要先安装openssl工具。

可以通过以下命令在Linux系统中安装openssl:```shellsudo apt-get install openssl```2. 使用openssl加密字符串在Shell脚本中,我们可以使用openssl工具加密字符串。

以下示例演示了如何使用openssl加密字符串:```shell#!/bin/bashoriginal_string="Hello World"encrypted_string=$(echo $original_string | openssl enc -aes-256-cbc -a -salt -pass pass:password)echo "Encrypted string: $encrypted_string"```在上述示例中,我们使用了openssl的enc命令,并指定使用AES-256-CBC算法进行加密,-a参数表示使用Base64编码,-salt参数表示使用加盐的方式进行加密,-pass参数指定加密密码。

3. 使用openssl解密字符串使用openssl解密字符串的方法与加密类似。

以下示例演示了如何使用openssl解密字符串:```shell#!/bin/bashencrypted_string="U2FsdGVkX1+BXKU00hfeC1/kuVuJDT3Am687Uk 1IhLJ/QmDR6xzqDHezmOt1"decrypted_string=$(echo $encrypted_string | openssl enc -d -aes-256-cbc -a -salt -pass pass:password)echo "Decrypted string: $decrypted_string"```在上述示例中,我们使用了openssl的enc命令,并指定使用AES-256-CBC算法进行解密,-d参数表示解密操作。

Win7环境中安装OpenSSL的详细步骤

Win7环境中安装OpenSSL的详细步骤

Win7环境中安装OpenSSL的步骤一、基础环境需求1、下载必要软件◆ActivePerl软件下载网址:/activeperl/downloads/◆C++编译器:Microsoft Visual C++Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。

VC++整合了便利的除错工具,特别是整合了微软视窗程式设计(Windows API)、三维动画DirectX API,Microsoft .NET框架。

目前最新的版本是Microsoft Visual C++ 2012。

◆OpenSSL软件下载网址:/source/2、软件安装ActivePerl安装完成后,用cmd命令进入安装目录C:\Perl\eg下,输入“perl example.pl”,如果显示:Hello from ActivePerl!,则说明软件已经正常安装。

确认ActivePerl正常安装后,需要设置环境变量,并重启操作系统。

C++编译器,安装了Visual Studio 2008,如下图:1.初始化编译环境perl Configure VC-WIN322.运行“ms\do_ms”3.运行“nmake -f ms\ntdll.mak”,执行make进行编译。

4.运行”nmake -f ms\ntdll.mak test”,检查上一步编译是否成功。

5.运行”nmake -f ms\ntdll.mak install”。

6.查看安装结果。

打开c:\openssl-0.9.8e目录将看到有三个文件夹。

7.编译完成。

8.打开openssl双击“F:\usr\local\ssl\bin\”目录下的openssl.exe。

opensslAES加密算法API的使用示例

opensslAES加密算法API的使用示例

opensslAES加密算法API的使⽤⽰例openssl为⽤户提供了丰富的指令,同时也提供了供编程调⽤的API,本⽂以使⽤128位aes算法的ecb模式进⾏加密和解密验证,如下所⽰第⼀种⽅法,直接使⽤aes算法提供的api进⾏调⽤,代码如下#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <openssl/aes.h>int main(void){char userkey[AES_BLOCK_SIZE];unsigned char *date = malloc(AES_BLOCK_SIZE*3);unsigned char *encrypt = malloc(AES_BLOCK_SIZE*3 + 4);unsigned char *plain = malloc(AES_BLOCK_SIZE*3);AES_KEY key;memset((void*)userkey, 'k', AES_BLOCK_SIZE);memset((void*)date, 'p', AES_BLOCK_SIZE*3);memset((void*)encrypt, 0, AES_BLOCK_SIZE*6);memset((void*)plain, 0, AES_BLOCK_SIZE*3);/*设置加密key及密钥长度*/AES_set_encrypt_key(userkey, AES_BLOCK_SIZE*8, &key);int len = 0;/*循环加密,每次只能加密AES_BLOCK_SIZE长度的数据*/while(len < AES_BLOCK_SIZE*3) {AES_encrypt(date+len, encrypt+len, &key);len += AES_BLOCK_SIZE;}/*设置解密key及密钥长度*/AES_set_decrypt_key(userkey, AES_BLOCK_SIZE*8, &key);len = 0;/*循环解密*/while(len < AES_BLOCK_SIZE*3) {AES_decrypt(encrypt+len, plain+len, &key);len += AES_BLOCK_SIZE;}/*解密后与原数据是否⼀致*/if(!memcmp(plain, date, AES_BLOCK_SIZE*3)){printf("test success\n");}else{printf("test failed\n");}printf("encrypt: ");int i = 0;for(i = 0; i < AES_BLOCK_SIZE*3 + 4; i++){printf("%.2x ", encrypt[i]);if((i+1) % 32 == 0){printf("\n");}}printf("\n");return0;}编译执⾏结果如下xlzh@cmos:~/cmos/openssl-code/aes$ gcc aes.c -o aes.out -lssl -lcryptoxlzh@cmos:~/cmos/openssl-code/aes$ ./aes.outtest successencrypt: 08 a9 74 4d b0 6657 1b 57 fe 60 3d 91 e4 ed 5308 a9 74 4d b0 6657 1b 57 fe 60 3d 91 e4 ed 5308 a9 74 4d b0 6657 1b 57 fe 60 3d 91 e4 ed 5300000000xlzh@cmos:~/cmos/openssl-code/aes$第⼆种⽅法,使⽤EVP框架,⽰例如下#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <openssl/evp.h>#include <openssl/aes.h>int main(void){char userkey[EVP_MAX_KEY_LENGTH];char iv[EVP_MAX_IV_LENGTH];unsigned char *date = malloc(AES_BLOCK_SIZE*3);unsigned char *encrypt = malloc(AES_BLOCK_SIZE*6);unsigned char *plain = malloc(AES_BLOCK_SIZE*6);EVP_CIPHER_CTX ctx;int ret;int tlen = 0;int mlen = 0;int flen = 0;memset((void*)userkey, 'k', EVP_MAX_KEY_LENGTH);memset((void*)iv, 'i', EVP_MAX_IV_LENGTH);memset((void*)date, 'p', AES_BLOCK_SIZE*3);memset((void*)encrypt, 0, AES_BLOCK_SIZE*6);memset((void*)plain, 0, AES_BLOCK_SIZE*6);/*初始化ctx*/EVP_CIPHER_CTX_init(&ctx);/*指定加密算法及key和iv(此处IV没有⽤)*/ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, iv);if(ret != 1) {printf("EVP_EncryptInit_ex failed\n");exit(-1);}/*禁⽤padding功能*/EVP_CIPHER_CTX_set_padding(&ctx, 0);/*进⾏加密操作*/ret = EVP_EncryptUpdate(&ctx, encrypt, &mlen, date, AES_BLOCK_SIZE*3); if(ret != 1) {printf("EVP_EncryptUpdate failed\n");exit(-1);}/*结束加密操作*/ret = EVP_EncryptFinal_ex(&ctx, encrypt+mlen, &flen);if(ret != 1) {printf("EVP_EncryptFinal_ex failed\n");exit(-1);}tlen = mlen + flen;tlen = 0;mlen = 0;flen = 0;EVP_CIPHER_CTX_cleanup(&ctx);EVP_CIPHER_CTX_init(&ctx);ret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, iv);if(ret != 1) {printf("EVP_DecryptInit_ex failed\n");exit(-1);}EVP_CIPHER_CTX_set_padding(&ctx, 0);ret = EVP_DecryptUpdate(&ctx, plain, &mlen, encrypt, AES_BLOCK_SIZE*3); if(ret != 1) {printf("EVP_DecryptUpdate failed\n");exit(-1);}ret = EVP_DecryptFinal_ex(&ctx, plain+mlen, &flen);if(ret != 1) {printf("EVP_DecryptFinal_ex failed\n");exit(-1);}/*对⽐解密后与原数据是否⼀致*/if(!memcmp(plain, date, AES_BLOCK_SIZE*3)) {printf("test success\n");} else {printf("test failed\n");}printf("encrypt: ");int i;for(i = 0; i < AES_BLOCK_SIZE*3+4; i ++){printf("%.2x ", encrypt[i]);if((i+1)%32 == 0){printf("\n");}}printf("\n");return0;}编译执⾏结果如下:xlzh@cmos:~/cmos/openssl-code/aes$ gcc evp.c -o evp.out -lssl -lcryptoxlzh@cmos:~/cmos/openssl-code/aes$ ./evp.outtest successencrypt: 08 a9 74 4d b0 6657 1b 57 fe 60 3d 91 e4 ed 5308 a9 74 4d b0 6657 1b 57 fe 60 3d 91 e4 ed 5308 a9 74 4d b0 6657 1b 57 fe 60 3d 91 e4 ed 5300000000xlzh@cmos:~/cmos/openssl-code/aes$EVP框架是对openssl提供的所有算法进⾏了封装,在使⽤⼯程中只需要修改少量的代码就可以选择不同的加密算法,在⼯作中通常采⽤这种⽅式。

openssl用法

openssl用法

openssl用法OpenSSL是一个开放源代码的加密工具包,用于实现安全通信、数据加密和数字签名等。

它支持多种加密算法和协议,包括SSL、TLS、AES、RSA等。

在使用OpenSSL时,首先需要生成证书。

可以使用以下命令来生成自签名证书:```openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out cert.pem```这个命令会生成一个新的RSA 2048位的密钥,并将其保存在key.pem文件中。

它还会生成一个自签名的X.509证书,并将其保存在cert.pem文件中。

生成证书之后,就可以使用OpenSSL进行加密和解密操作了。

例如,可以使用以下命令来加密一个文件:```openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.txt```这个命令会将plaintext.txt文件使用AES 256位加密,并将加密后的数据保存在encrypted.txt文件中。

可以使用以下命令来解密这个文件:```openssl enc -aes-256-cbc -d -in encrypted.txt -out plaintext.txt```这个命令会将encrypted.txt文件解密,并将解密后的数据保存在plaintext.txt文件中。

除了加密和解密操作之外,OpenSSL还可以用于生成和验证数字签名。

例如,可以使用以下命令来生成一个RSA私钥和公钥:```openssl genpkey -algorithm RSA -out private.key -aes256 openssl rsa -in private.key -pubout -out public.key```这个命令会生成一个带有AES 256位加密的RSA私钥,并将其保存在private.key文件中。

createaeskeybyopenssl方法

createaeskeybyopenssl方法

创建AES密钥的方法一、介绍现如今,数据安全已经成为了各个领域中不可或缺的一部分。

在网络通讯、数据存储和传输等方面,加密技术起到了至关重要的作用。

而AES(Advanced Encryption Standard,高级加密标准)作为一种对称加密算法,被广泛应用于各种信息安全领域。

在使用AES算法进行加密和解密时,首先需要生成一个AES密钥。

本文将介绍在使用OpenSSL工具生成AES密钥的方法。

二、什么是OpenSSL1. OpenSSL是一个强大的开源加密库,提供了众多加密算法的实现,包括对称加密算法(如AES、DES等)、非对称加密算法(如RSA、ECC等)以及哈希算法(如MD5、SHA-1等)。

2. OpenSSL被广泛应用于计算机网络中的安全通讯协议(如HTTPS、SSL/TLS等)、数据加密和数字签名等领域。

三、OpenSSL中生成AES密钥的方法1. 打开命令行终端或者控制台,并输入以下命令:```openssl rand -base64 32```2. 解释:1) openssl:表示要使用OpenSSL工具进行操作。

2) rand:表示生成随机数。

3) -base64:表示以Base64编码格式输诞辰成的随机数。

4) 32:表示生成的随机数的长度,单位为字节(在AES算法中,常用的密钥长度为128位、192位或256位,对应16字节、24字节和32字节)。

四、实例演示1. 打开命令行终端或者控制台,并输入以下命令:```openssl rand -base64 32```2. 运行结果示例:```o0JNzsy0flnUXqpB4n0Oyu02htFRrqqtJd0FmM7kkz4=```五、总结通过本文介绍,我们了解了使用OpenSSL工具生成AES密钥的方法,该方法简单快捷,适用于各种评台和系统环境下。

AES算法作为当前最为流行和安全的对称加密算法之一,其密钥的生成至关重要。

  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.}。

相关文档
最新文档