㈠ 用openssl对文件加密解密的详细正确程序
不好说,直接用TRUECPYPT吧
㈡ 如何利用OpenSSL库进行RSA加密和解密
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/engine.h>
intmain(intargc,char*argv[])
{
printf("openssl_testbegin ");
RSA*rsa=NULL;
charoriginstr[]="hello ";//这是我们需要加密的原始数据
//allocateRSAstructure,首先需要申请一个RSA结构题用于存放生成的公私钥,这里rsa就是这个结构体的指针
rsa=RSA_new();
if(rsa==NULL)
{
printf("RSA_newfailed ");
return-1;
}
//generateRSAkeys
BIGNUM*exponent;
exponent=BN_new();//生成RSA公私钥之前需要选择一个奇数(oddnumber)来用于生成公私钥
if(exponent==NULL)
{
printf("BN_newfailed ");
gotoFAIL1;
}
if(0==BN_set_word(exponent,65537))//这里选择奇数65537
{
printf("BN_set_wordfailed ");
gotoFAIL1;
}
//这里molus的长度选择4096,小于1024的molus长度都是不安全的,容易被破解
if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL))
{
printf("RSA_generate_key_exfailed ");
gotoFAIL;
}
char*cipherstr=NULL;
//分配一段空间用于存储加密后的数据,这个空间的大小由RSA_size函数根据rsa算出
cipherstr=malloc(RSA_size(rsa));
if(cipherstr==NULL)
{
printf("malloccipherstrbuffailed ");
gotoFAIL1;
}
//下面是实际的加密过程,最后一个参数paddingtype,有以下几种。
/*
RSA_PKCS1_PADDINGPKCS#1v1.5padding..
RSA_PKCS1_OAEP_PADDING
EME-OAEPasdefinedinPKCS#1v2.0withSHA-1,..
RSA_SSLV23_PADDING
PKCS#1v1.5paddingwithanSSL-.
RSA_NO_PADDING
RawRSAencryption.ntheapplicationcode..
*/
//这里首先用公钥进行加密,选择了RSA_PKCS1_PADDING
if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING))
{
printf("encryptionfailure ");
gotoFAIL2;
}
printf("theoriginalstringis%s ",originstr);
printf("theencryptedstringis%s ",cipherstr);
//Now,let'
//下面来用私钥解密,首先需要一个buffer用于存储解密后的数据,这个buffer的长度要足够(小于RSA_size(rsa))
//这里分配一个长度为250的字符数组,应该是够用的。
chardecrypted_str[250];
intdecrypted_len;
if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_str,rsa,RSA_PKCS1_PADDING)))
{
printf("decryptionfailure ");
gotoFAIL2;
}
printf("decryptedstringlengthis%d,decryped_stris%s ",decrypted_len,decrypted_str);
FAIL2:
free(cipherstr);
FAIL1:
BN_free(exponent);
FAIL:
RSA_free(rsa);
return0;
}
以上是源代码,下面使用下面的编译命令在源码所在路径下生成可执行文件
gcc *.c -o openssl_test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include
其中,-lcrypto和-ldl是必须的,前者是OpenSSL中的加密算法库,后者是用于成功加载动态库。
㈢ 如何使用Openssl,已经有Key文件,如何使用这个文件进行加密和解密
个东西,我这边需要将一个字符串加密以后传递给第三方公司提供的jsp页面。加密方式是第三方提供一个Key文件,就像银行网银用的文件证书一样,使用RSA方式加密的。现在第三方公司给我了两个文件:server.cer和test.pfx。
他们给的ReadME文件内容如下:
p ,可以用于解密和加密两个功能。
cer里只包含公
㈣ linux文档怎么加密,用什么办法好
合力天下LINUX防泄密系统概述
Linux具有天生秉承的优势,越来越多的企业转向了Linux的开发和应用。使用Linux操作系统的单位多数都拥有自主知识产权,如果有丝毫的泄露,都会造成巨大的损失。 基于多年的数据防泄漏防护经验,北京合力天下数码信息技术有限公司自主研发了一套运行在Linux平台环境下,防止Linux系统中自主知识产权泄密的产品。该系统在不改变用户使用习惯、计算机文件格式和编译程序的情况下,对指定类型的代码文件进行实时、透明的加解密。所有通过非法途径获得的数据,都将以乱码文件形式表现。
合力天下LINUX防泄密系统是一款功能强大且易于使用的LINUX文档加密软件产品,该系统采用“驱动层AES智能透明加密技术”对指定类型的文件进行实时、强制、透明的加解密。在正常使用时,计算机内存中的文件是以受保护的明文形式存放,但硬盘上保存的数据却处于加密状态,如果没有合法的使用身份、访问权限和正确的安全通道,所有加密文件都将以密文状态保存。
合力天下LINUX防泄密系统稳定可靠,并且具备良好的可扩展性,能同时满足企业其它应用系统文档加密需求,有效防止数据丢失或泄露,有助于更深入、更全面地实施数据保护,从而确保企业机密数据的高度安全。
合力天下LINUX防泄密系统产品架构
合力天下LINUX防泄密系统采用控制台/服务器/代理(B/S/C)体系:服务器(Server)、客户端代理(Agent)和控制台(Management Console)三部分组成。
M/S/A三部分相互协调工作:管理员通过控制台的WEB浏览器制订灵活的安全策略;安全策略被保存在服务器上;终端计算机上安装的代理主动连接服务器;接收到网络连接后,服务器把制订好的策略下发到该终端计算机;终端计算机代理的安全引擎执行安全策略,进行安全控制。
合力天下LINUX防泄密系统部署模式
合力天下LINUX防泄密系统功能特点
一驱动层透明加密
针对研发单位,可对JAVA、C、C++ 等各种源代码文件进行透明加密保护;
针对手机、电子书等版权单位,可针对任何需要保护其版权的文档类型进行透明加密保护;
针对办公环境,可对任何文件类型加密。
二编译加密源代码
针对研发单位,加密的源代码文档无需解密为明文,可直接通过编译进程进行编译。
编译后的Image文件是明文,便于产品的测试与分发。
三网络通信安全隧道
加密文档(如源代码)需要通过文档版本管理软件(如CVS\SVN\GIT)通过网络或文件系统进行集中备份与共享。加密文件系统提供网络安全隧道功能,保护网络通信中的加密文件。
如加密文件需要保存到服务器上,既可以密文存储到服务器上也可以明文存储到服务器上。
如明文存储到服务器上,加密系统的网络安全隧道可与合力天下LINUX防泄密系统服务器数据保护网关联动,实现加密文档在上传到服务器网关自动解密,下载文件时网关自动加密。如此既保障了文档的可靠性、可用性,又保障文档的安全性。
四进程合法性验证
对进程进行签名认证,验证通过的进程,才是合法进程,才能对加密文件行读写操作。
任何伪造进程的方式都无法读写加密文档。如更改进程名称、SVN多种协议读写加密文件等都无法解密文件。
五自身安全强保护
系统具有自我保护能力,在自身受到破坏不完整时整个系统依然能够保障数据的安全性。
粘贴/拷贝控制
系统具有防粘贴拷贝能力,不可信进程可以拷贝任何数据到可信进程;但可信进程不允许拷贝数据到任何其它进程,有效防止数据的泄露。
六文件批量加密
可对明文文件批量加密,针对开源的文件很方便的合并到工程里面。
批量加密流程具有保护机制,防止已经加密的文件再次加密,造成文件的损坏。
七可离线工作
离线即客户端网络连接不上加密服务器所处的状态,如外出办公等。
加密系统支持离线办公,离线的安全策略为最近一次在线时的文件加密策略。
八与Windows加密系统兼容
Linux加密系统与Windows加密系统相互兼容:Windows加密的文件在Linux下能够操作,在Linux加密的文件在Windows下能够操作。
合力天下linux防泄密系统加密规则
1.不可信进程规则
不可信进程创建、编辑的文件都是明文文件。
不可信进程读取的加密文件是乱码,不可以使用。
2.可信进程规则
可信进程创建符合加密规则的文件是加密的文件。
可信进程可以透明读写编辑加密文件。
原不加密但符合加密规则文件,一但可信进程进行了编辑,则原文件成为加密文件。
可信进程在未创建、读写加密文件前,创建不符合加密规则的文件是明文的。
可信进程在未创建、读写加密文件前,可以任意编辑明文文件,该文件不被加密。
可信进程一旦创建、编辑了加密文件,则后续创建、编辑的所有文件都是加密的。
3.进程间拷贝粘贴规则
可以自由的从不可信进程中粘贴拷贝文字到可信进程。
可以自由的从不可信进程中粘贴拷贝文字到不可信进程。
可信进程的文字拷贝受到安全保护,禁止随意拷贝文字。
4.编译器进程规则
编译器创建的二进制文件是明文的,可以随意烧到嵌入式设备中。
5.离线加密规则
支持离线文档加密。
离线规则为最近一次上线的文档加密规则。
6.文件批量加密
支持文件批量代码加密转化。
㈤ 如何用openSSL协议加密文件
openSSL这个很复杂!一定要用它吗?.net(.net 2.0以上)自带有RSA算法(非对称加密)的签名 加密功能!具体在System.Security.Cryptography命令空间下的System.Security.Cryptography.RSACryptoServiceProvider
㈥ 基于OPENSSL的安全客户端设计与实现
Openssl提供了各种各样的加密算法,包括对称和非对称加密算法。考虑到你要实现安全客户端,那么在与服务器交换信息时,需要加密。
基本思想是先用非对称加密算法加密算法交换对称密钥,以后发送和接收消息时就使用对称密钥。
㈦ 求用OpenSSL做的RSA文件加密程序实例,VC++6.0的,各位大侠帮帮忙,急用呀,多谢啦
#include <openssl/rsa.h>
#include <openssl/sha.h>
int main()
{
RSA *r;
int bits=1024,ret,len,flen,padding,i;
unsigned long e=RSA_3;
BIGNUM *bne;
unsigned char*key,*p;
BIO *b;
unsigned charfrom[500],to[500],out[500];
bne=BN_new();
ret=BN_set_word(bne,e);
r=RSA_new();
ret=RSA_generate_key_ex(r,bits,bne,NULL);
if(ret!=1)
{
printf("RSA_generate_key_ex err!\n");
return -1;
}
/* 私钥i2d */
b=BIO_new(BIO_s_mem());
ret=i2d_RSAPrivateKey_bio(b,r);
key=malloc(1024);
len=BIO_read(b,key,1024);
BIO_free(b);
b=BIO_new_file("rsa.key","w");
ret=i2d_RSAPrivateKey_bio(b,r);
BIO_free(b);
/* 私钥d2i */
/* 公钥i2d */
/* 公钥d2i */
/* 私钥加密 */
flen=RSA_size(r);
printf("please select private enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("5.RSA_X931_PADDING\n");
scanf("%d",&padding);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else
{
printf("rsa not surport !\n");
return -1;
}
for(i=0;i<flen;i++)
memset(&from[i],i,1);
len=RSA_private_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_private_encrypt err!\n");
return -1;
}
len=RSA_public_decrypt(len,to,out,r,padding);
if(len<=0)
{
printf("RSA_public_decrypt err!\n");
return -1;
}
if(memcmp(from,out,flen))
{
printf("err!\n");
return -1;
}
/* */
printf("please select public enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("2.RSA_SSLV23_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("4.RSA_PKCS1_OAEP_PADDING\n");
scanf("%d",&padding);
flen=RSA_size(r);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_SSLV23_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else if(padding==RSA_PKCS1_OAEP_PADDING)
flen=flen-2 * SHA_DIGEST_LENGTH-2 ;
else
{
printf("rsa not surport !\n");
return -1;
}
for(i=0;i<flen;i++)
memset(&from[i],i+1,1);
len=RSA_public_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_public_encrypt err!\n");
return -1;
}
len=RSA_private_decrypt(len,to,out,r,padding);
if(len<=0)
{
printf("RSA_private_decrypt err!\n");
return -1;
}
if(memcmp(from,out,flen))
{
printf("err!\n");
return -1;
}
printf("test ok!\n");
RSA_free(r);
return 0;
}
上述程序中当采用公钥RSA_SSLV23_PADDING加密,用私钥RSA_SSLV23_PADDING解密时会报错,原因是openssl源代码错误:
rsa_ssl.c函数RSA_padding_check_SSLv23有:
if (k == -1) /* err */
{
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_SSLV3_ROLLBACK_ATTACK);
return (-1);
}
修改为k!=-1即可。
各种padding对输入数据长度的要求:
私钥加密:
RSA_PKCS1_PADDING RSA_size-11
RSA_NO_PADDING RSA_size-0
RSA_X931_PADDING RSA_size-2
公钥加密
RSA_PKCS1_PADDING RSA_size-11
RSA_SSLV23_PADDING RSA_size-11
RSA_X931_PADDING RSA_size-2
RSA_NO_PADDING RSA_size-0
RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2
㈧ 在Linux系统中加密文件的方法
1.
oppnssl
md5
加密字符串的方法
a.手动输入命令及过程如下:
代码如下:
#openssl
//在终端中输入openssl后回车。
OpenSSL>
md5
//输入md5后回车
123456
//接着输入123456,不要输入回车。然后按3次ctrl+d。
//123456后面的就是密文了
解释:为何在输入123456后不回车呢?
是因为openssl默认会把回车符当做要加密的字符串中的一个字符,所以得到的结果不同。如果你输入123456后回车,在按2次ctrl+d。得到的结果是:
代码如下:
OpenSSL>
md5
123456
//因为openssl不忽略回车符导致的
b.或者直接用管道命令
代码如下:
#
echo
-n
123456
|
openssl
md5
//必须要有-n参数,否则就不是这个结果了。
解释:为何要加-n这个参数?
-n就表示不输入回车符,这样才能得到正确的结果。如果你不加-n,那么结果和前面说的一样为:
代码如下:
//因为openssl不忽略回车符导致的
2.用openssl加密文件。
代码如下:
#openssl
md
5
-in
1.txt
㈨ iOS使用openSSL加密应该怎么做
最近几天折腾了一下如何在iOS上使用RSA来加密。iOS上并没有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我们可以通过制作自签名的x509证书(由于对安全性要求不高,我们并不需要使用CA认证的证书),再调用x509的相关API来进行加密。接下来记录一下整个流程。
第一步,制作自签名的证书
1.最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示输入内容就行了。
几个说明:
public_key.der是输出的自签名的x509证书,即我们要用的。
private_key.pem是输出的私钥,用来解密的,请妥善保管。
rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。
-days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。
事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)
1)创建私钥
openssl genrsa -out private_key.pem 1024
2)创建证书请求(按照提示输入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自签署根证书
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。
第二步,使用public_key.der来进行加密。
1.导入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.从public_key.der读取公钥。
4.加密。
下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)
RSA.h
//
// RSA.h
//
#import Foundation.h>
@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}
- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;
@end
RSA.m
//
// RSA.m
//
#import "RSA.h"
@implementation RSA
- (id)init {
self = [super init];
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}
NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}
certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}
policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}
SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}
publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}
maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}
- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen = 128; // 当前RSA的密钥长度是128字节
void *cipher = malloc(cipherLen);
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);
NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}
- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}
@end
使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}