2021SC@SDUSC-SEAL全同态加密库(八)

SEAL全同态加密库(八)

一.公钥的代码

首先是根据相应的算法建立相关的公钥,然后将其保存

		public void Set(PublicKey assign)
        {
    
    
            if (null == assign)
                throw new ArgumentNullException(nameof(assign));

            NativeMethods.PublicKey_Set(NativePtr, assign.NativePtr);
        }
        public long SaveSize(ComprModeType? comprMode = null)
        {
    
    
            comprMode = comprMode ?? Serialization.ComprModeDefault;
            if (!Serialization.IsSupportedComprMode(comprMode.Value))
                throw new ArgumentException("Unsupported compression mode");

            ComprModeType comprModeValue = comprMode.Value;
            NativeMethods.PublicKey_SaveSize(
                NativePtr, (byte)comprModeValue, out long outBytes);
            return outBytes;
        }

     	public long Save(Stream stream, ComprModeType? comprMode = null)
        {
    
    
            comprMode = comprMode ?? Serialization.ComprModeDefault;
            if (!Serialization.IsSupportedComprMode(comprMode.Value))
                throw new ArgumentException("Unsupported compression mode");

            ComprModeType comprModeValue = comprMode.Value;
            return Serialization.Save(
                (byte[] outptr, ulong size, byte cm, out long outBytes) =>
                    NativeMethods.PublicKey_Save(NativePtr, outptr, size,
                    cm, out outBytes),
                SaveSize(comprModeValue), comprModeValue, stream);
        }

        public long UnsafeLoad(SEALContext context, Stream stream)
        {
    
    
            if (null == context)
                throw new ArgumentNullException(nameof(context));

            return Serialization.Load(
                (byte[] outptr, ulong size, out long outBytes) =>
                    NativeMethods.PublicKey_UnsafeLoad(NativePtr, context.NativePtr,
                    outptr, size, out outBytes),
                stream);
        }
      
        public long Load(SEALContext context, Stream stream)
        {
    
    
            if (null == context)
                throw new ArgumentNullException(nameof(context));

            return Serialization.Load(
                (byte[] outptr, ulong size, out long outBytes) =>
                    NativeMethods.PublicKey_Load(NativePtr, context.NativePtr,
                    outptr, size, out outBytes),
                stream);
        }

二.具体解释

公钥加密的一个重要作用就是处理密钥的分发问题。在这方面,使用公钥加密实际上存在两个不同的方面。
(1)公钥的分发 ;
(2)使用公钥加密分发私钥。
下面依次分析这两个方面。
公钥证书:
从字面理解,公钥加密的意思就是公钥是公开的。所以,如果有某种广泛接受的公钥算法(如RSA),任何参与者都可以给其他参与者发送他的密钥,或向群体广播自己的密钥。虽然这种方法非常方便,但是它也有个很大的缺点:任何人都可以伪造公共通告,即某用户可以伪装成用户A向其他参与者发送公钥或广播公钥。直到一段时间后用户A发觉了伪造并且警告其他参与者,伪造者在此之前都可以读到试图发送给A的加密消息,并且使用假的公钥进行认证。
解决这个问题的方法就是使用公钥证书。实际上,公钥证书由公钥加上公钥所有者的用户ID以及可信的第三方签名的整个数据块组成。通常,第三方就是用户团体所信任的认证中心。用户可通过安全渠道把他的公钥提交给这个CA,获取证书。然后用户就可以发布这个证书。任何需要该用户公钥的人都可以获取这个证书,并且通过所附的可信签名验证其有效性。
密钥分发:
使用传统加密时,双方能够安全通信的基本要求就是他们能共享密钥。假设Bob想建立个消息申请,使他能够与对方安全地交换电子邮件,这里的“对方”是指能够访问Internet或者与Bob共享其他网络的人。假定Bob要用传统密码来做这件事,Bob和他的通信者(Aice)必须构建一个通道来共享任何其他人都不知道的唯一密钥。他们是如何实现的呢?如果Alice在Bob的隔壁房间里,Bob可以生成密钥,把它写在纸上或存储在磁盘上,然后交给Alice。但是如果Alice在欧洲或世界的另一边,Bob该怎么办呢?他可以用传统的加密方法加密密钥并且将它以电子邮件方式发送给Alice。但是这意味着Bob和 Alice必须共享一个密钥来加密这个新的密钥。此外,Bob和任何其他使用这种新电子邮件包的人都与他们的潜在通信者之间面临着相同的问题:任何一对通信者之间都必须共享一个唯一的密钥 。
这问题的一种解决方案就是使用Differ- Hellman密钥交换。该方法的确在广泛使用。然而这种方案也有它的缺点,比如最简单形式的Differ- Hellman不能为两个通信者提供认证。
一种很好的替代方法就是使用公钥证书。当Bob想要与Alice通信时,他可按下面的步骤操作:
(1)准备消息;
(2)利用一次性传统会话密钥,使用传统加密方法加密消息;
(3)利用Aice的公钥,使用公钥加密的方法加密会话密钥;
(4)把加密的会话密钥附在消息上,并且把它发送给Aice,只有Aice能够解密会话密钥进而恢复原始消息。如果Bob通过Alice的公钥证书获得Alice的公钥,则Bob能够确定它是有效的密钥。

猜你喜欢

转载自blog.csdn.net/weixin_46021936/article/details/122520799