2017-04-07 14 views
0

を返していない私は、暗号化し、次のコードを使用して復号化しようとしています:ENCRYPTBYPASSPHRASEとDECRYPTBYPASSPHRASEが正しい値に

declare @decryptedValue nvarchar(4000) 
declare @encryptedValue varbinary(8000) 

SET @encryptedValue = ENCRYPTBYPASSPHRASE('SQL SERVER 2008','SomeValue') 
Set @decryptedValue = DECRYPTBYPASSPHRASE('SQL SERVER 2008',@encryptedValue) 

print @decryptedValue 

をしかし、復号化された値は、私は(「someValueの」)に渡されたものではありませんが、いくつかの暗号化charecter潓敭慖畬e。不思議な

私はそれが動作を下回るような二つの機能作成した場合:

CREATE FUNCTION dbo.Encrypt(@str nvarchar(4000)) 
    RETURNS varbinary(8000) 
    AS BEGIN 
    DECLARE @res varbinary(8000) 
    SET @res = ENCRYPTBYPASSPHRASE('SQL SERVER 2008',@str) 
    RETURN (@res) 
    END 
    GO 



    CREATE FUNCTION dbo.Decrypt(@encrypt varbinary(8000)) 
    RETURNS nvarchar(4000) 
    AS 
    BEGIN 
    DECLARE @res nvarchar(4000) 
    SET @res = DECRYPTBYPASSPHRASE('SQL SERVER 2008',@encrypt) 
    RETURN(@res) 
    END 
    GO 


declare @x nvarchar(4000) 
declare @code varbinary(8000) 
SET @code = dbo.Encrypt('SomeValue') 
Print @code 
set @x = dbo.Decrypt(@code) 
print @x 

私は何をしないのですか?

+0

問題はnvarcharで、varchatに変更するとうまくいきます – Simsons

答えて

2

問題は、varchar値を暗号化し、復号化された値をnvarcharにキャストしていることです。これらの2つのデータ型は、異なるバイト構造を持っています。 (文字通り1文字)けれどもこれは、簡単に、固定だ:それはあなたの関数で働いていた理由として

declare @decryptedValue nvarchar(4000) 
declare @encryptedValue varbinary(8000) 

SET @encryptedValue = ENCRYPTBYPASSPHRASE('SQL SERVER 2008',N'SomeValue') --note the "N" before "N'SomeValue'" 
Set @decryptedValue = DECRYPTBYPASSPHRASE('SQL SERVER 2008',@encryptedValue) 

print @decryptedValue 

、関数の引数は、自身があなたが暗黙の変換を取得している、型付けされているので。したがって、Encrypt関数に'SomeValue'を指定すると、それはnvarcharバージョンに変換され、encryptbypassphrase()に渡されます。

関連する問題