作者:{Craftsman}@ArkTeam
PowerShell是运行在windows机器上实现系统和应用程序自动化管理的命令行脚本环境,是cmd.exe命令行提示符的加强版。微软之所以将Powershell定位为Power,并非夸大其词,而是PowerShell依赖.NET环境的支持,支持.NET对象,有很好的可读性和易用性,可以说位居当前所有shell之首。
本文以PowerShell调用操作系统的RSA类库为例,实现RSA签名验证功能。RSA的签名验证用于通信数据防篡改,运行机制如图1所示。
图1 RSA签名验证机制
在Visual Studio中建立dll动态链接库工程,使用操作系统的RSACryptoServiceProvider类库,实现如下功能函数:
public void RSAKey(out string xmlKeys, out string xmlPublicKey) //生成RSA密钥对
public void GetHash(string strSource, ref string strHashData) // 获取hash摘要
public void SignatureFormatter(string strKeyPrivate, string strHashbyteSignature, ref string strEncryptedSignatureData) //RSA签名
public bool SignatureDeformatter(string strKeyPublic, string strHashbyteDeformatter, string strDeformatterData) // RSA验签
部分功能函数的关键代码实现如下图2-4所示,编译并生成动态链接库RSACryption.dll。
图2 生成RSA密钥对函数关键代码
图3 RSA签名函数关键代码
图4 RSA验签函数关键代码
新建PowerShell脚本RSACryption.ps1,在脚本中使用LoadFile方法加载自建的动态链接库RSACryption.dll,使用New-Object创建动态链接库中类名为RSACryption的对象$a,通过对象$a调用该类下的生成公私钥对方法RSAKey([ref] $privatekey, [ref] $pubicKey),获取明文摘要GetHash($msg, [ref] $signedHash),并对摘要使用SignatureFormatter($privatekey, $signedHash, [ref] $signedMsg)方法进行签名。在PowerShell脚本中使用自定义动态链接库实现RSA签名关键代码实现如图5所示。
图5 PowerShell使用自定义DLL实现RSA签名
新建PowerShell脚本CheckSigned.ps1,在脚本中使用LoadFile方法加载动态链接库RSACryption.dll,将公钥$pubicKey赋值为RSACryption.ps1生成的公钥,将$msg赋值为ArkTeam,将$signedMsg赋值为RSACryption.ps1生成的值,对$msg和$signedMsg使用公钥$pubicKey进行签名验证。在PowerShell脚本中使用自定义动态链接库实现RSA验签关键代码如图6所示。
图6 PowerShell使用自定义DLL实现RSA签名
运行PowerShell签名验证脚本CheckSigned.ps1,签名验证结果返回True,如图7所示,表明签名验证结果是正确的。
图7 RSA签名验证结果