SQL Server
SQL Server
Duplicate PHP RSA Encryption
See more RSA Examples
Demonstrates how to duplicate the following PHP function.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
-- Duplicate the following PHP code:
--
-- public function encryptRSA($plainText,$rsaMOD,$pubKEY){
-- $rsa = new RSA();
-- $rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1);
-- $publicKey = [
-- 'e' => new BigInteger($pubKEY,16),
-- 'n' => new BigInteger($rsaMOD,16)
-- ];
--
-- $rsa->loadKey($publicKey);
-- $ciphertext = $rsa->encrypt($plainText);
-- return bin2hex($ciphertext);
-- }
--
-- $plainText="key=abcdefghijkmnopq&iv=abcdefghijkmnopq&h=12345678&s=12345678"
-- $rsaMOD="F0946D8F05604809E24B8CFFD30349CEA9E5F4D320BFD9E9AA1B088863F02C43E7997D37A3E27B4F8F359F1744DB6B20A437067C0D325A80660D12FF56A57673"
-- $pubKEY="010001"
-- We have the RSA modulus in hex
DECLARE @rsaMOD nvarchar(4000)
SELECT @rsaMOD = 'F0946D8F05604809E24B8CFFD30349CEA9E5F4D320BFD9E9AA1B088863F02C43E7997D37A3E27B4F8F359F1744DB6B20A437067C0D325A80660D12FF56A57673'
-- The RSA exponent in hex is "010001", which is 65537 in decimal. It's typically the exponent that is always used.
DECLARE @rsaEXP nvarchar(4000)
SELECT @rsaEXP = '010001'
-- Get the RSA modulus and exponent in base64.
DECLARE @bdMod int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @bdMod OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
DECLARE @bdExp int
EXEC @hr = sp_OACreate 'Chilkat.BinData', @bdExp OUT
EXEC sp_OAMethod @bdMod, 'AppendEncoded', @success OUT, @rsaMOD, 'hex'
EXEC sp_OAMethod @bdExp, 'AppendEncoded', @success OUT, @rsaEXP, 'hex'
-- Build the XML representation of the RSA public key
DECLARE @xml int
EXEC @hr = sp_OACreate 'Chilkat.Xml', @xml OUT
EXEC sp_OASetProperty @xml, 'Tag', 'RSAPublicKey'
EXEC sp_OAMethod @bdMod, 'GetEncoded', @sTmp0 OUT, 'base64'
EXEC sp_OAMethod @xml, 'UpdateChildContent', NULL, 'Modulus', @sTmp0
EXEC sp_OAMethod @bdExp, 'GetEncoded', @sTmp0 OUT, 'base64'
EXEC sp_OAMethod @xml, 'UpdateChildContent', NULL, 'Exponent', @sTmp0
-- Load the RSA public key into a Chilkat public key object.
DECLARE @pubkey int
EXEC @hr = sp_OACreate 'Chilkat.PublicKey', @pubkey OUT
EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
EXEC sp_OAMethod @pubkey, 'LoadFromString', @success OUT, @sTmp0
-- Setup the RSA object for encryption and do it..
DECLARE @rsa int
EXEC @hr = sp_OACreate 'Chilkat.Rsa', @rsa OUT
EXEC sp_OASetProperty @rsa, 'VerboseLogging', 1
EXEC sp_OAMethod @rsa, 'UsePublicKey', @success OUT, @pubkey
-- Use PKCSv1.5 padding
EXEC sp_OASetProperty @rsa, 'PkcsPadding', 1
-- Encrypt and return the string as hex.
EXEC sp_OASetProperty @rsa, 'EncodingMode', 'hex'
DECLARE @plainText nvarchar(4000)
SELECT @plainText = 'key=abcdefghijkmnopq&iv=abcdefghijkmnopq&h=12345678&s=12345678'
DECLARE @cipherText nvarchar(4000)
EXEC sp_OAMethod @rsa, 'EncryptStringENC', @cipherText OUT, @plainText, 0
EXEC sp_OAGetProperty @rsa, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
EXEC sp_OAGetProperty @rsa, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @bdMod
EXEC @hr = sp_OADestroy @bdExp
EXEC @hr = sp_OADestroy @xml
EXEC @hr = sp_OADestroy @pubkey
EXEC @hr = sp_OADestroy @rsa
RETURN
END
-- Note: The PKCSv1_5 padding incorporates random bytes. Therefore, the RSA encryption will produce different results each time -- all of which are valid
-- and decrypt correctly to the same original text.
PRINT @cipherText
EXEC @hr = sp_OADestroy @bdMod
EXEC @hr = sp_OADestroy @bdExp
EXEC @hr = sp_OADestroy @xml
EXEC @hr = sp_OADestroy @pubkey
EXEC @hr = sp_OADestroy @rsa
END
GO