草庐IT

基于区块链的隐私保护与访问控制云框架

Chahot 2023-04-09 原文

AuthPrivacyChain

摘要
云计算是一种提供共享和支持无处不在的按需访问计算的计算模型,为许多行业提供新的数据处理和服务,显著降低用户的计算和存储成本,并提高易用性。随着云规模和强度的发展,云安全已经成为云计算领域的一个重要问题。访问控制是保护企业和个人存储在云中的敏感数据的关键安全技术之一。由于云采用集中式访问控制机制,云中的敏感数据很容易被黑客或云内部管理人员篡改或泄露。为了解决这个问题,我们提出了一个基于区块链的带有隐私保护的访问控制框架,名为AuthPrivacyChain。首先,我们使用区块链中节点的账号地址作为身份,同时重新定义云数据的访问控制权限,将数据加密存储在区块链中。在此之后,我们在AuthPrivacyChain中设计了访问控制、授权和授权撤销流程。最后,我们实现了基于企业运营系统(EOS)的AuthPrivacyChain,结果表明,AuthPrivacyChain不仅可以防止黑客和管理员非法访问资源,还可以保护授权用户的隐私。

云计算作为一种新的计算模型,可以为用户提供无所不在的服务,降低用户存储和计算的成本,提高使用的便利性,因此越来越多的企业和个人选择将数据存储在云中。然而,随着云计算规模和强度的发展,对雾计算和边缘计算的研究也逐渐兴起,云安全问题已经成为制约云计算发展的重要因素。2017年7月,云安全联盟(CSA)发布了《安全云计算v4.0中关键领域重点指导》,确定了14个云计算安全重点领域,其中访问控制是云安全的核心技术之一。同时,访问控制也是当前的研究热点,其目的是利用访问控制来防止存储在云中的资源被非法用户访问或窃取。云计算的三大服务系统:基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS),都需要通过访问控制[14]来保护相关资源,因此访问控制在云计算中扮演着重要的角色。
与传统的计算模型相比,云计算经历了计算和存储模式变化,主要体现在以下五个方面:1)用户无法控制云中的资源;2)用户与云之间缺乏信任;3)迁移技术可能导致数据改变安全域;4)多租户技术使访问主体被重新定义;5)虚拟化技术可能导致同一物理设备上的资源被盗。面对这些挑战,学术界出现了大量关于云访问控制的研究,业界也在尝试实现现有的访问控制技术。但两者都对身份、密钥、权限、认证信息等具有集中的存储和管理模式。因此,访问控制技术仍然存在安全和隐私两个方面的问题.
1)外部攻击者攻击可信中心,篡改存储在中心服务器上的授权数据库,非法访问或窃取用户存储在云中的资源。
2)云系统管理员对授权数据库进行管理,对资源具有访问和管理权限,恶意云系统管理员可能会利用该权限非法访问资源或篡改授权数据库非法访问。

在本文中,我们提出了AuthPrivacyChain—一种基于区块链并具有云隐私保护的访问控制框架来解决上述问题。我们的贡献如下:
分散访问控制体系结构。Authprivacychain使用去中心化、防篡改的区块链存储访问控制权限,并使用区块链账户地址作为身份,设计访问控制、授权和授权撤销流程。授权的隐私保护。由于区块链的透明性,很容易泄露用户的隐私。Authprivacychain将访问控制权限加密存储在区块链中,有效保护用户的隐私。安全。Authprivacychain既能保证资源的机密性、完整性、可用性、真实性和可问责性,又能抵御各种外部和内部的攻击

当前云计算的风险

无论是学术界研究的三种云访问控制方法,还是工业界实际使用的云访问控制方法,都有两个共同的特点:
一个或多个可信中心。学术界提出的三种访问控制,包括传统的云访问控制模型、基于加密的访问控制模型和虚拟化的访问控制模型,都需要一个或多个可信中心来存储身份、密钥、授权权限等。首先,在云访问控制模型中,基于ucon的模型需要可信中心来存储访问权限和权限相关的义务和条件。其次,在基于加密的访问控制中,基于abe的访问控制需要一个或多个可信中心来管理和分发密钥。最后,在虚拟化访问控制中,将虚拟机的访问控制权限存储在可信中心。此外,该行业实际使用的云访问控制需要一个可信的中心来存储用户身份信息和访问权限
内部可信系统管理员(SA)。云为用户提供了三种典型的服务:IaaS、PaaS和SaaS。尽管它们提供不同的服务,但它们都需要内部可信SA来管理访问策略。例如,IaaS主要为用户提供计算能力和存储空间,并要求SA监控和管理对基础设施环境的访问。PaaS主要为用户提供一个开发和执行应用程序的平台,需要SA监控和管理平台的访问控制;SaaS主要为用户提供他们需要的应用程序,还需要SA来管理和维护访问控制策略。

综上所述,如图1所示,云访问控制高级视图可以抽象四个实体:CSP、数据用户(DU)、数据所有者(DO)、SA。SA管理ACPD (access control policy database)。
由于上述云访问控制的两个特点,受到攻击时存在两个问题

问题1外部攻击者篡改ACPD:攻击可信授权中心,篡改ACPD,导致数据泄漏或被盗。例如,攻击者窃取ACPD,冒充授权用户访问或窃取资源,篡改ACPD,增加非法访问的权限,或删除合法用户的权限,破坏机密性、可用性和完整性。
问题2恶意SA特权访问或篡改ACPD例如,恶意SA利用自己的特权绕过身份认证,非法访问资源,造成隐私泄露,破坏机密性和完整性;恶意SA篡改ACPD,导致隐私泄露,破坏机密性、完整性和可用性。

访问控制框架

为了解决上述问题,我们提出了AuthPrivacyChain——一种基于区块链的云端隐私保护访问控制框架。本节包含系统模型、初始化、访问控制、授权和撤销。系统模型如图2所示,它由四个实体组成

•云。它为用户提供认证和数据存储。云决定了DU或DO的访问权限
区块链。
•区块链。它是开放的、透明的、防篡改的、不可逆的,和分布式数据库一样,我们使用它作为访问控制的授权策略数据库。
•DO: DO将资源上传到Cloud,并将资源的访问权限发布到区块链。
•DU: DU如果得到Cloud的许可,就可以访问这些资源。
我们假设云是半可信的,即云的软件、硬件、非对称密钥和业务流程是可信的,但云SA是不可信的。区块链被认为是值得信任的。首先,DO将资源上传到云端,然后通过区块链中的注册交易发布授权。DU向Cloud发送一个资源请求,Cloud查询区块链,判断请求是否有权限,最后对请求进行回复。

接下来,我们将介绍一些稍后使用的符号。首先,我们列出了一些重要的函数和符号,如表1。然后,我们列出一些关键字段并进行设置,如表2所示。

初始化

始化包括三个实体注册(Cloud、DO和DU)和资源发布。

要成为区块链的合法用户或节点,Cloud、DO和DU必须先在区块链注册。在设计注册流程之前,我们介绍KGen、AGen和SynData三个功能,以及ISave接口,这些功能都是通过区块链实现的。
KGen()的目标是产生输入为空,输出为KW的KW;
AGen()用于创建钱包地址,输入Kpub,输出Addr;
SynData()的目标是同步时间从ti到tj的数据。输入ti和tj,输出blockdataij
ISave()是区块链存储接口,输入地址、签名私钥、存储内容和时间,输出tranID。

然后我们设计Cloud的注册流程如图3所示,包括三个步骤。

云向区块链发送注册请求

要成为区块链的合法用户或节点,Cloud、DO和DU必须先在区块链注册。在设计注册流程之前,我们介绍了KGen、AGen和SynData三个功能,以及ISave接口,这些功能都是通过区块链实现的。KGen()的目标是产生输入为零的KW,输出为KW;AGen()用于创建钱包地址,输入Kpub,输出Addr;SynData()的目标是同步时间从ti到tj的数据。输入ti和tj,输出blockdataij。ISave()是区块链存储接口,输入地址、签名私钥、存储内容和时间,输出tranID。

然后我们设计Cloud的注册流程如图3所示,包括三个步骤。

  1. 云->区块链:CRequest|| ti || tj。云向区块链发送注册请求。
  2. 区块链->Cloud: E(ks1, Addrcloud || Kcloud_w)||
    E (KpubC, ks1) | | blockdataij。区块链调用KGen()生成Kcloud_w(Kpub_cloud_w, Kpri_cloud_w),然后调用AGen(Kpub_cloud_w)生成Addrcloud。区块链使用ks1加密Addrcloud || Kcloud_w),使用KpubC加密ks1,然后发送E(ks1, Addrcloud || Kcloud_w)|| E(KpubC, ks1)|| blockdataij到Cloud。云调用D(KpriC, ks1)解密得到ks1,调用D(ks1, Addrcloud || Kcloud_w)解密得到Addrcloud || Kcloud_w,其中blockdataij表示在区块链中从ti到tj生成的数据. 通常,云会自动调用SynData(ti, tj)同步blockdataij到本地数据库。
  3. Cloud->区块链:Txreg_cloud (Addrcloud, Kpri_cloud_w, cloudInfo)。Cloud调用Txreg_cloud保存cloudInfo到
    ,其中Txreg_cloud是一个智能合约,如算法1所示。

    在智能合约Txreg_cloud中,第1行配置区块链的连接,第2行获取当前时间戳,第3行调用区块链存储接口发布注册事务,最后,第4行返回tranID。

用户注册

我们设计了DO和DU的注册流程,如图所示,包括两个步骤。因为DO的注册过程与DU相同,所以我们统称为用户注册。
➀User->区块链:URequest|| tl| | tm。用户向区块链发送注册请求。
➁区块链->用户:E(ks2,Addruser|| Kuser_w)|| E(KpubU, ks2)|| blockdatalm.➁区块链->用户:E(ks2,Addruser|| Kuser_w)|| E(KpubU, ks2)|| blockdatalm。区块链生成Kuser_w,并调用AGen(Kpub_user_w)生成Addr_user.然后发送E(ks2, Addruser|| Kuser_w)|| E(KpubU,ks2)|| blockdatalm到User。用户调用D(KpriU, ks2)和D(ks2,Addruser|| Kuser_w)解密以获得Addruser|| Kuser_w,其中blockdatalm表示从tl到tm在区块链中生成的数据。通常,用户会自动调用SynData(tl, tm)将blockdatalm同步到本地数据库。

资源发布

资源发布是DO将资源上传到云端,并将资源的元数据发布到区块链。在设计注册流程之前,我们引入了区块链的ResUp()函数和ISend()接口。ResUp()通过DO将资源上传到云端,输入resContent和resUpURL,输出resInfo;ISend()是一个区块链事务接口,输入Kpri_from、Addrfrom、Addrto、索引、内容和时间戳,输出tranID。

我们设计了资源发布的注册流程,如图所示,包括三个步骤。

  1. DO→云:ResUp (resContent resUpUrl)。DO调用ResUp将资源上传到Cloud。
  2. 云->DO: E(ks3, resInfo)|| E(kpubDO, ks3)。Cloud返回E(ks3, resInfo)给DO, DO用ks3解密E,得到resInfo。
  3. 区块链:Txreg_resource(Kpri_DO_w, AddrDO, Addrcloud, KpubC, resInfo)。DO调用Txreg_resource将资源注册信息发布到区块链,其中Txreg_resource是一个智能合约,如算法2所示。

    在智能合约Txreg_resource中,第1行配置区块链,第2行通过hash计算资源唯一标识符,第3-8行有效地加密访问控制权限,第9行分配bresInfo,第10行获得一个时间戳,第11行调用
    ISend和第12行最终返回tranID。

访问控制

访问控制是指用户在云中请求资源,云根据区块链中存储的权限决定用户是否可以访问该资源。如果用户有权限,云将允许用户访问资源,访问记录将存储在区块链中。在设计访问控制的工作流程之前,我们引入了VerifyCap函数和一个由Cloud实现的isquery, VerifyCap()接口,用于验证两个权限集之间的包含关系,分别输入puttrescap1, KpriC和resCAP_S2,并输出true或false,如果resCAP1包含resCAP_S2,则返回true,否则返回false。区块链实现的IQuery()是一个事务查询接口,输入index、Addr1和Addr2,其中index代表查询索引值,Addr1和Addr2代表交易双方,输出tran。

我们设计了一个访问控制工作流,如图所示图包含六个步骤。

  1. User->Cloud: E(ks4, Addruser|| resInfo ')|| E(KpubC,ks4)。
    用户向Cloud发送一个请求,其中resInfo '表示用户想要访问的资源。
  2. Cloud->区块链:QFCapChain(Addruser, Addrcloud, hash_resID)。Cloud首先解密得到Addruser, resInfo ',然后计算Hash(resInfo. resid)得到hash_resID,然后调用FCapChain得到resCAP_S,其中QFCapChain是一个智能合约,如算法3所示。
  3. 区块链- >云:resCAP_S。区块链返回resCAP_S到Cloud。
  4. Cloud: VerifyCap(resInfo . rescap, KpriC, resCAP_S)。云解密resCAP_S,得到Addruser的resCAP,并与resInfo .resCAP比较,如果resCAP包含resInfo .resCAP,则允许该用户访问该资源;否则,不允许访问。
  5. 云- - - >用户:Response_accessInfo。云的回报
    Response_accessInfo to User,如果Response_accessInfo为true,则User可以访问该资源,否则不允许访问。
  6. Cloud->区块链:Txlog_record (Kpri_cloud_w, Addrcloud, Addruser, AddrDO, kpub, resInfo, timestamp)。云调用Txlog_record发布区块链中访问资源的日志,其中Txlog_record是一个智能合约,如算法4所示。

认证

授权分为直接授权和间接授权。直接授权意味着DO,间接授权是由被授予DU的用户授权给其他用户。

直接认证

直接授权是指资源的所有者将访问权限授予其他用户。我们设计了资源发布的直接授权工作流,如图7所示,包括7个步骤。

  1. DU1->Cloud: E(ks5, auth_flag|| AddrU1|| AddrDO|| resInfo)|| E(KpubC, ks5)。DU1向Cloud发送授权请求,其中auth_flag为授权标志。云解密得到AddrU1, AddrDO和resInfo。
  2. 云→区块链:hash_resID | | AddrDO。云计算Hash(resID)来获得hash_resID,并调用QFCapChain (AddrDO, Addrcloud, hash_resID)。
  3. 区块链- >云:resCAP_S。区块链返回资源的resCAP_S给Cloud。
  4. 云:VerifyCap (resInfo。resCAP、KpriC resCAP_S)。Cloud检查AddrDO是否确实是资源的主机,并调用VerifyCap来确认DU1请求的权限在主机授权范围内。如果请求超出授权范围,授权过程将立即终止。否则,执行5。
  5. Cloud->;DO: E(ks6, auth_flag|| AddrU1|| resInfo)|| E(KpubDO, ks6)。Cloud向DO发送DU1的授权请求。
  6. DO->;区块链:Txpublish(Kpri_DO_w, AddrDO, AddrU1, KpubC, resInfo)。DO调用Txpublish将授权发布到区块链。Txpublish是一个智能合约,如算法5所示。

  1. DO->DU1: auth_flag。DO发送auth_flag给DU1。

非直接认证

间接授权是指被授权的DU授权给其他用户,包括至少5个实体:DO(资源所有者)、DU1(授权者)、DU2(请求者)、区块链和Cloud。具体的交互过程如图8所示。从图中可以看出,间接授权的步骤与直接授权基本相同,不同之处是授权用户需要向DO发送间接授权通知(E(ks9, auth_flag|| AddrU2|| resInfo|| authTime)|| E(KpubDO, ks9)),此处不再重复。

授权撤消

撤销授权是指被授权用户撤销授权。撤销授权是一种非常复杂的过程。为了规范授权撤销过程,我们定义了以下规则:
•谁授权,谁撤销。
•所有者可以撤销直接授权和间接授权。
•只有当被授权用户撤销所有授权时,上一级授权用户才能撤销该授权用户的授权
根据上述三条规则,授权撤销包括基本授权撤销和复杂授权撤销。基本授权撤销是授权撤销的基本操作单元,即不再具有间接授权的权限被撤销。例如,我们假设DU1授权给DU2,而DU2不再具有任何间接授权。具体的交互过程如下:我们设计了基本授权撤销的工作流程,如图9所示,包括六个步骤。

  1. DU1->Cloud: E(ks10, auth_revoc|| AddrU1|| AddrU2|| resInfo)|| E(KpubC, ks10)。DU1将授权撤销信息发送到Cloud,其中auth_revoc为授权撤销请求标志。
  2. Cloud->区块链:hash_resID|| AddrU1|| AddrU2。云调用QFCapChain查询AddrU1是否授权给AddrU2。
  3. 区块链- >云:resCAP_S。区块链返回resCAP_S到Cloud。
  4. 云→DUl: auth_revoc。Cloud解密resCAP_S得到resCAP,如果resCAP不为空,Cloud发送auth_revo给DU1。
  5. DU1->区块链:Txpublish(Kpri_U1_w, AddrU1, AddrU2, KpubC, resInfo)。DU1调用Txpublish来撤销授权,其中resInfo。resCAP =null。
  6. DU1->DU2: E(ks11, auth_revoc|| AddrU1|| AddrU2|| resInfo.resID)|| E(KpubU1, ks11)。DU1 send auth_revoc|| AddrU1|| AddrU2|| resInfo。resID to DU2,通知DU2权限已被撤销。

复杂授权撤销通常是指带有一个或多个间接授权的授权撤销。但是,所有复杂的授权撤销都是由基本授权撤销逐步完成的。
例如,我们假设以下场景:DU1有授权,DU1授权给DU2, DU2不仅使用访问资源的权限,而且还授权给DU3。从图中可以看出,具体的交互过程如下

特点及安全性分析

对于去中心化,传统的云访问控制包括身份认证、授权、访问权限和审计。云作为一个可信的访问控制中心,所有进程都是集中的。用户通常通过用户名和密码进行认证,用户名和密码存储在云认证数据库中。与授权相关的信息直接存储在云ACPD中。访问记录通常存储在云日志数据库中。然而,对于AuthPrivacyChain来说,它没有一个可信中心,也不要求用户将云作为一个可信中心。用户通过由KW生成的Addr进行认证。与授权相关的信息直接存储在区块链中。访问记录也存储在区块链中。在性能方面,在身份认证方面,AuthPrivacyChain优于传统的访问控制,因为它使用Addr而不是用户名和密码。在身份认证授权和访问控制方面,AuthPrivacyChain略低于传统的访问控制,因为它需要访问区块链,但它可以通过选择合适的超级节点来访问区块链来缩小差距。

一方面,无论是普通用户还是SA, AuthPrivacyChain都可以确保用户存储在云中的数据不会被未经授权的人泄露或使用,从而确保DO数据的保密性。另一方面,在AuthPrivacyChain中,DU、DO、Cloud和区块链之间的信息传输都是加密的,访问控制权限也加密存储在区块链中,从而保证了保密性和AuthPrivacyChain的隐私。的完整性。一方面,对于用户上传的数据,AuthPrivacyChain为用户提供了8种数据完整性和权限完整性保护机制。它设置数据结构resInfo中的reshash成员和数据结构resCAP中的resCAPhash。另一方面,AuthPrivacyChain可以为用户提供系统完整性,保证系统可以正常执行预定的功能,避免有意或无意的未经授权的操作。的可用性。AuthPrivacyChain可以快速工作,不能拒绝授权用户的访问。的真实性。一方面,AuthPrivacyChain中的DU、DO、Cloud和区块链是可以被验证和信任的,因为它们要加入系统,必须先公开自己的证书(公钥)。另一方面,对于AuthPrivacyChain的信息传输来说,信息和信息源是正确的,能够验证用户的身份,每一个输入到系统的信息都来自一个可信的来源。因为当AuthPrivacyChain传递信息时,它需要解密接收方的私钥。就问责性而言,AuthPrivacyChain并不是一个绝对安全的系统。因此,AuthPrivacyChain必须能够追踪到对安全泄漏负有责任的一方。我们设计了AuthPrivacyChain,将实体的活动记录保存在区块链中,以便进行事后审计分析,跟踪安全事件或解决纠纷。
从上面的分析可以看出,AuthPrivacyChain不仅可以防止来自外部用户的攻击,还可以防止内部管理人员在请求访问资源时,必须对每个人进行身份验证,包括SA

小结

在现有的区块链和云的安全相关问题中,利用区块链解决云环境下的隐私保护访问控制的研究成果很少。大多数传统的云访问控制都有一个或多个可信中心和可信的内部管理员,因此很容易受到内部和外部的攻击。
为了解决云环境中攻击者非法访问资源的问题,本文设计了一种具有隐私保护的云环境访问控制框架AuthPrivacyChain。所有与授权相关的事务都由用户发布到区块链。本文实现了基于EOS区块链的框架模型,并将访问权限等信息作为区块链事务的附加描述。实验结果表明,只有具有访问权限的用户才能访问资源。所以这个的解决方案可以满足机密性,完整性、可用性、真实性和责任性,不仅可以防止来自外部用户的攻击,还可以防止内部管理攻击。

实验数据


相关数据请见原文
参考文献及原文链接:
AuthPrivacyChain: A Blockchain-Based Access Control Framework With Privacy Protection in Cloud

有关基于区块链的隐私保护与访问控制云框架的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  10. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

随机推荐