openssl.net rsa加密工作示例需要

时间:2010-08-20 12:12:30

标签: c# openssl rsa

是否有人使用OpenSSL.NET进行RSA加密的任何工作示例?我想使用以PEM格式存储的私钥来加密一些数据。

我创建一个OpenSSL.Crypto.RSA对象并希望使用PrivateEncrypt方法,但它抛出OpenSSLException而没有其他数据(空Errors数组,没有内部异常)。在使用PrivateEncrypt方法之前,我使用从命令读取的数据填充所有属性(如PublicModulus,PrivateExponent等) openssl rsa -in private_key.pem -text -noout

有人知道如何将PEM文件读入OpenSSL.Crypto.RSA对象或有任何其他有效的加密示例吗?

1 个答案:

答案 0 :(得分:3)

这是Linux上的C / C ++,但是直到我痛苦地开始工作才找到这样的简单例子

生成关键命令行

  

openssl genrsa -out privkey.pem 2048

HelloWord.cpp

#include <global_inc.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

int main()
{
        char *message = "Hello World";
        unsigned char* encrypted = (unsigned char *) malloc(500);
        unsigned char* decrypted = (unsigned char *) malloc(500);
        int bufSize;

        FILE *keyfile = fopen("privkey.pem", "r");
        RSA *rsa = PEM_read_RSAPrivateKey(keyfile, NULL, NULL, NULL);
        printf("\n\nStarting Message = %s\n", message);
        if (rsa == NULL)
        {
                printf("Badness has occured! Did not read key file\n");
                return 0;
        }
        else
        {
                printf("Opened the key file OK!\n");
        }

        bufSize = RSA_public_encrypt(strlen(message), (unsigned char *) message, encrypted, rsa, RSA_PKCS1_PADDING);
        if (bufSize == -1)
        {
                printf("Badness has occured! encryption failed\n");
                RSA_free(rsa);
                return 0;
        }
        else
        {
                printf("Encrypted the message OK! = \n%s\n", encrypted );
        }

        if (RSA_private_decrypt(bufSize, encrypted, decrypted, rsa, RSA_PKCS1_PADDING) != -1)
        {
                printf("\nMessage decrypted to : %s\n", decrypted);
        }
        else
        {
                printf("Badness has occured! decryption failed\n");
                RSA_free(rsa);
                return 0;
        }

        RSA_free(rsa);
        return 1;
}

生成文件

#-----------------------------------------------------------------------------
#
# File    : global.make
# Date    : 09/03/2009
# Author  : Tom Nortillo
#
# Description: universal make definitions for development area
#
#-----------------------------------------------------------------------------

#----------------------------------
#   GENERAL
#----------------------------------
CPP=g++
BASE=/home/joneil001/RSAEncryption
CPPFLAGS = -c -fPIC
LDFLAGS = -static
BIN = ${BASE}


#===================================================================
#
#                    THIRD-PARTY LIBRARIES
#
#===================================================================

#-------------------
#       ORACLE
#-------------------
ORALIB= -L${ORACLE_LIB} -lclntsh
ORAINC= -I${ORACLE_HOME}/precomp/public -I${ORACLE_HOME}/rdbms/public

PROC=${ORACLE_BIN}/proc
ORAEXT = -DORACA_STORAGE_CLASS=extern -DSQLCA_STORAGE_CLASS=extern


#-------------------
#     LIBXML
#-------------------
XML_INC = -I${BASE}/lib_xml/include/libxml2
XML_LIB = -L${BASE}/lib_xml/lib -lxml2


#--------------------------------
#     GOOGLE PROTOCOL BUFFERS
#--------------------------------
GOOGLE_INC = -I${BASE}/lib_google/include
GOOGLE_LIB = -L${BASE}/lib_google/lib -lprotobuf
GOOGLE_BIN = ${BASE}/lib_google/bin


#==============================================
#
#                   OpenSSL
#
#=============================================

OPENSSL_LIB = -L/usr/lib64 -lcrypto -L/usr/lib64/openssl/engines -laep -lcswift  -lchil -l4758cca -lgmp -lubsec -lsureware -lnuron -latalla


#===================================================================
#
#                    BUILD COMMAND-LINES
#
#===================================================================

#--------------------
#   LIBRARIES
#--------------------
LIBLIST = -L${BASE}/lib \
          ${OPENSSL_LIB}

# Repeated twice because of library inter-dependencies
LIBS = ${LIBLIST} ${LIBLIST}



#--------------------
#   INCLUDES
#--------------------
LOCAL_INC = -I.

INCLUDE = ${LOCAL_INC} ${ORAINC}




#===================================================================
#
#                          RULES
#
#===================================================================
.SUFFIXES: .cpp
.SUFFIXES: .cc $(SUFFIXES)
.SUFFIXES: .pc $(SUFFIXES)
.SUFFIXES: .proto $(SUFFIXES)

.cpp.o:
        ${CPP} ${CPPFLAGS} ${INCLUDE} $<

.cc.o:
        ${CPP} ${CPPFLAGS} ${INCLUDE} $<

.pc.o:
        ${PROC} SYS_INCLUDE=/usr/include include=${ORAINC} code=CPP cpp_suffix=cpp parse=NONE dbms=v8 iname=$< oname=$(*F).cpp lname=$(*F).lis
        ${CPP} ${CPPFLAGS} ${INCLUDE} ${ORAINC} ${ORAEXT} $*.cpp
        rm -f $*.cpp
        rm -f $*.lis
        rm -f tp*

.proto.o:
        ${GOOGLE_BIN}/protoc --cpp_out=. $<
        ${CPP} ${CPPFLAGS} ${INCLUDE} ${ORAINC} ${ORAEXT} $*.pb.cc




#===================================================================
#
#                           TARGETS
#
#===================================================================


TARGET=doit

OBJECTS = HelloWorld.o

all: ${OBJECTS}
        ${CPP} ${INCLUDE} -o ${BIN}/${TARGET} ${OBJECTS} ${LIBS}

clean:
        touch HelloWorld.o; rm *.o