Sample code for 30+ languages & platforms
SQL Server

Duplicate PHP RSA Encryption

See more RSA Examples

Demonstrates how to duplicate the following PHP function.

Chilkat SQL Server Downloads

SQL Server
-- 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