// 读共享内存中的秘钥, 进行对称加密
// des , 3des , aes
class MyInterface
{
public:
// json参数磁盘的json格式的配置文件
MyInterface(string json);
~MyInterface();
// 数据加密
// 参数: 待加密的数据->明文, 返回值: 密文
string encryptData_des(string str);
string encryptData_3des(string str);
string encryptData_aes(string str);
// 数据解密
// 参数: 待解密的数据-密文, 返回值: 明文
string decryptData_des(string str);
string decryptData_3des(string str);
string decryptData_aes(string str);
}
提供的接口不是一个应用程序 -> 不是进程
class NodeSecKeyInfo
{
public:
NodeSecKeyInfo() : status(0), seckeyID(0)
{
bzero(clientID, sizeof(clientID));
bzero(serverID, sizeof(serverID));
bzero(seckey, sizeof(seckey));
}
int status; // 秘钥状态: 1可用, 0:不可用
int seckeyID; // 秘钥的编号
char clientID[12]; // 客户端ID, 客户端的标识
char serverID[12]; // 服务器ID, 服务器标识
char seckey[128]; // 对称加密的秘钥
};
{
"ServerID":"0001", // 当前秘钥协商服务器的ID
"ClientID":"1111" // 不能写死,和当前业务服务器通信的客户端ID --> 这个是动态的
"ShmKey":"/usr/lib", // 通过 shmKey 打开一块已经存在的共享内存
"MaxNode":100, // 共享内存中存储的最大节点数 -> 用于遍历
}
{
"ServerID":"0001",
"ClientID":"1111"
"shmKey":"/usr/local", // 通过 shmKey 打开一块已经存在的共享内存
"MaxNode":1, // 共享内存中存储的最大节点数 -> 用于遍历
}
// 将配置文件中的serverID和clientID去掉
// 找秘钥的方式:
- 通过clientID和serverID进行查找
- 通过秘钥ID查找
// 通过配置文件打开共享内存
{
"shmKey":"/usr/local", // 通过 shmKey 打开一块已经存在的共享内存
"MaxNode":1, // 共享内存中存储的最大节点数 -> 用于遍历
}
class SecKeyShm : public BaseShm
{
public:
// 打开或创建一块共享内存
// 这个操作是在父类中做的
SecKeyShm(int key, int maxNode);
SecKeyShm(string pathName, int maxNode);
~SecKeyShm();
void shmInit();
int shmWrite(NodeSecKeyInfo* pNodeInfo);
NodeSecKeyInfo shmRead(string clientID, string serverID);
/**********************************************/
NodeSecKeyInfo shmRead(int keyID);
// 通过这个函数读共享内存中的第一个NodeSecKeyInfo
// 给客户端使用
// 这个不会
NodeSecKeyInfo shmFirstNode();
private:
int m_maxNode;
};
NodeSecKeyInfo SecKeyShm::shmRead(int keyID)
{
int ret = 0;
// 关联共享内存
NodeSecKeyInfo* pAddr = NULL;
pAddr = static_cast<NodeSecKeyInfo*>(mapShm());
if (pAddr == NULL)
{
cout << "共享内存关联失败..." << endl;
return NodeSecKeyInfo();
}
cout << "共享内存关联成功..." << endl;
//遍历网点信息
int i = 0;
NodeSecKeyInfo info;
NodeSecKeyInfo* pNode = NULL;
// 通过clientID和serverID查找节点
cout << "maxNode: " << m_maxNode << endl;
for (i = 0; i < m_maxNode; i++)
{
pNode = pAddr + i;
cout << i << endl;
cout << "keyID: " <<keyID << endl;
//cout << "clientID 比较: " << pNode->clientID << ", " << clientID.data() << endl;
//cout << "serverID 比较: " << pNode->serverID << ", " << serverID.data() << endl;
if (pNode->seckeyID == keyID)
{
// 找到的节点信息, 拷贝到传出参数
info = *pNode;
cout << "++++++++++++++" << endl;
cout << info.clientID << " , " << info.serverID << ", "
<< info.seckeyID << ", " << info.status << ", "
<< info.seckey << endl;
cout << "===============" << endl;
break;
}
}
unmapShm();
return info;
}
// 生成.o
gcc/g++ *.c/*.cpp -c
// 打包.o
ar rcs libxxx.a *.o
# 生成.o -> 和位置无关使用的是相对地址
gcc/g++ *.c/*.cpp -c -fpic
# 生成动态库
gcc/g++ -shared *.o -o libxxx.so
打包加解密的库
这里要注意jsoncpp
的写法,
如果centos里json动态库的名字是libjson.so,那么就是写json.
因为我在安装json的时候创建软连接的名字是libjsoncpp.so,因此这里写的jsoncpp
jsoncpp;crypto
g++ -c *.cpp -std=c++11 -fpic
g++ -shared *.o -o libinterface.so
将头文件里的API和libxxx.so
文件发给用户就可以了。
在第4部分,打包的动态库所在的位置为:/root/projects/Interface
mv libinterface.so /usr/lib/
g++ *.cpp -lpthread -L/root/projects/Interface -linterface -ljsoncpp -lcrypto -std=c++11
g++ *.cpp -lpthread -linterface -ljsoncpp -lcrypto -std=c++11