【jdk源码设置】【生成word源码】【werkzeug源码解析】isign源码

时间:2024-11-23 10:39:46 来源:小猪源码授权 分类:探索

1.请问用C怎么输出π的值啊。
2.ASP.NET Core认证原理和实现
3.用Python解答一下?
4.如何计算100以内的奇数和偶数和?
5.求一个基于openssl写的ecc曲线的源代码

isign源码

请问用C怎么输出π的值啊。

       C代码和运行结果如下:

       可见在给定精度下,jdk源码设置输出π的近似值为3.,望采纳~

       附源码:

       #include <stdio.h>

       #define E 1e-4

       int main() {

       double pi = 0;

       int i,生成word源码 sign = 1; // sign表示正负号 

       for (i = 1; 1.0 / i >= E; i += 2) {

       pi += sign * 1.0 / i;

       sign = -sign;

       }

       pi = pi * 4;

       printf("%lf\n", pi);

       return 0;

       }

ASP.NET Core认证原理和实现

       é€šå¸¸åœ¨åº”用程序中,安全分为前后两个步骤:验证和授权。验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源。

        既然安全从验证开始,我们也就从验证开始介绍安全。

        我们先从比较简单的场景开始考虑,例如在 Web API 开发中,需要验证请求方是否提供了安全令牌,安全令牌是否有效。如果无效,那么 API 端应该拒绝提供服务。在命名空间 Microsoft.AspNetCore.Authentication 下,定义关于验证的核心接口。对应的程序集是 Microsoft.AspNetCore.Authentication.Abstractions.dll。

        在 ASP.NET 下,验证中包含 3 个基本操作:

        验证操作负责基于当前请求的上下文,使用来自请求中的信息,例如请求头、Cookie 等等来构造用户标识。构建的结果是一个 AuthenticateResult 对象,它指示了验证是否成功,如果成功的话,用户标识将可以在验证票据中找到。

        常见的验证包括:

        在授权管理阶段,如果用户没有得到验证,但所期望访问的资源要求必须得到验证的时候,授权服务会发出质询。例如,当匿名用户访问受限资源的时候,或者当用户点击登录链接的时候。授权服务会通过质询来相应用户。

        例如

        质询操作应该让用户知道应该使用何种验证机制来访问请求的资源。

        在授权管理阶段,如果用户已经通过了验证,但是对于其访问的资源并没有得到许可,此时会使用拒绝操作。

        例如:

        拒绝访问处理应该让用户知道:

        在这个场景下,可以看到,验证需要提供的基本功能就包括了验证和验证失败后的拒绝服务两个操作。在 ASP.NET Core 中,验证被称为 Authenticate,拒绝被称为 Forbid。 在供消费者访问的网站上,如果我们希望在验证失败后,不是像 API 一样直接返回一个错误页面,而是将用户导航到登录页面,那么,就还需要增加一个操作,这个操作的本质是希望用户再次提供安全凭据,在 ASP.NET Core 中,这个操作被称为 Challenge。这 3 个操作结合在一起,就是验证最基本的要求,以接口形式表示,就是 IAuthenticationHandler 接口,如下所示:

        验证的结果是一个 AuthenticateResult 对象。值得注意的是,它还提供了一个静态方法 NoResult() 用来返回没有得到结果,静态方法 Fail() 生成一个表示验证异常的结果,而 Success() 成功则需要提供验证票据。

        通过验证之后,会返回一个包含了请求者票据的验证结果。

        在 GitHub 中查看 AuthenticateResult 源码

        那么验证的信息来自哪里呢?除了前面介绍的 3 个操作之外,还要求一个初始化的操作 Initialize,通过这个方法来提供当前请求的上下文信息。

        在 GitHub 中查看 IAuthenticationHandler 定义

        有的时候,我们还希望提供登出操作,增加登出操作的接口被称为 IAuthenticationSignOutHandler。

        在 GitHub 中查看 IAuthenticationSignOutHandler 源码

        在登出的基础上,如果还希望提供登录操作,那么就是 IAuthenticationSignInHandler 接口。

        在 GitHub 中查看 IAuthenticationSignInHandler 源码

        直接实现接口还是比较麻烦的,在命名空间 Microsoft.AspNetCore.Authentication 下,微软提供了抽象基类 AuthenticationHandler 以方便验证控制器的开发,其它控制器可以从该控制器派生,以取得其提供的服务。

        通过类的定义可以看到,它使用了泛型。每个控制器应该有一个对应该控制器的配置选项,通过泛型来指定验证处理器所使用的配置类型,在构造函数中,可以看到它被用于获取对应的配置选项对象。

        在 GitHub 中查看 AuthenticationHandler 源码

        通过 InitializeAsync(),验证处理器可以获得当前请求的上下文对象 HttpContext。

        最终,作为抽象类的 ,希望派生类来完成这个验证任务,抽象方法 HandleAuthenticateAsync() 提供了扩展点。

        验证的结果是一个 AuthenticateResult。

        而拒绝服务则简单的多,直接在这个抽象基类中提供了默认实现。直接返回 HTTP 。

        剩下的一个也一样,提供了默认实现。直接返回 HTTP 响应。

        对于 JWT 来说,并不涉及到登入和登出,所以它需要从实现 IAuthenticationHandler 接口的抽象基类 AuthenticationHandler 派生出来即可。从 AuthenticationHandler 派生出来的 JwtBearerHandler 实现基于自己的配置选项 JwtBearerOptions。所以该类定义就变得如下所示,而构造函数显然配合了抽象基类的要求。

        在 GitHub 中查看 JwtBearerHandler 源码

        真正的验证则在 HandleAuthenticateAsync() 中实现。下面的代码是不是就很熟悉了,从请求头中获取附带的 JWT 访问令牌,然后验证该令牌的有效性,核心代码如下所示。

        在 GitHub 中查看 JwtBearerHandler 源码

        在 ASP.NET Core 中,你可以使用各种验证处理器,并不仅仅只能使用一个,验证控制器需要一个名称,它被看作该验证模式 Schema 的名称。Jwt 验证模式的默认名称就是 "Bearer",通过字符串常量 JwtBearerDefaults.AuthenticationScheme 定义。

        在 GitHub 中查看 JwtBearerDefaults 源码

        最终通过 AuthenticationBuilder 的扩展方法 AddJwtBearer() 将 Jwt 验证控制器注册到依赖注入的容器中。

        在 GitHub 中查看 JwtBearerExtensions 扩展方法源码

        一种验证处理器,加上对应的验证配置选项,我们再为它起一个名字,组合起来就成为一种验证架构 Schema。在 ASP.NET Core 中,可以注册多种验证架构。例如,授权策略可以使用架构的名称来指定所使用的验证架构来使用特定的验证方式。在配置验证的时候,通常设置默认的验证架构。当没有指定验证架构的时候,就会使用默认架构进行处理。

        还可以

        注册的验证模式,最终变成 AuthenticationScheme,注册到依赖注入服务中。

        在 GitHub 中查看 AuthenticationScheme 源码

        各种验证架构被保存到一个 IAuthenticationSchemeProvider 中。

        在 GitHub 中查看 IAuthenticationSchemeProvider 源码

        最终的使用是通过 IAuthenticationHandlerProvider 来实现的,通过一个验证模式的字符串名称,可以取得所对应的验证控制器。

        在 GitHub 中查看 IAuthenticationHandlerProvider 源码

        它的默认实现是 AuthenticationHandlerProvider,源码并不复杂。

        在 GitHub 中查看 AuthenticationHandlerProvider 源码

        验证中间件的处理就没有那么复杂了。

        找到默认的验证模式,使用默认验证模式的名称取得对应的验证处理器,如果验证成功的话,把当前请求用户的主体放到当前请求上下文的 User 上。

        里面还有一段特别的代码,用来找出哪些验证处理器实现了 IAuthenticationHandlerProvider,并依次调用它们,看看是否需要提取终止请求处理过程。

        在 GitHub 中查看 AuthenticationMiddle 源码

用Python解答一下?

       Python代码和运行结果如下:

       è¾“å…¥n=5,输出为5,与1-3+5-7+9=5结果相符,望采纳~

       é™„python源码:

n = int(input())

sign = 1 # 表示符号

sum = 0 # 前n项和

for i in range(1, 2 * n, 2): # 第n项为2n-1

    sum += sign * i

    sign = -sign # 符号正负交替

print(sum)

如何计算以内的奇数和偶数和?

       第i项的绝对值为2*i-1,再用一个变量sign表示±1系数,werkzeug源码解析每次变号即可

       C代码和运行结果如下:

       原式每两项结果为-2,前项的结果为-2*=-,与输出相符,望采纳~

       附源码:

       #include <stdio.h>

       int main() {

           int i = 1, sum = 0, sign = 1;

           while (i <= ) {

               sum += sign * (2 * i - 1);

               i++;

               sign = -sign; // 变号

           }

           printf("%d\n", sum);

           return 0;

       }

求一个基于openssl写的ecc曲线的源代码

       下面的例子生成两对ECC密钥,并用它做签名和验签,并生成共享密钥。

       #include <string.h>

       #include <stdio.h>

       #include <openssl/ec.h>

       #include <openssl/ecdsa.h>

       #include <openssl/objects.h>

       #include <openssl/err.h>

       int main()

       {

        EC_KEY *key1,plc视频源码*key2;

        EC_POINT *pubkey1,*pubkey2;

        EC_GROUP *group1,*group2;

        int ret,nid,size,i,sig_len;

        unsigned char*signature,digest[];

        BIO *berr;

        EC_builtin_curve *curves;

        int crv_len;

        char shareKey1[],shareKey2[];

        int len1,len2;

        /* 构造EC_KEY数据结构 */

        key1=EC_KEY_new();

        if(key1==NULL)

        {

        printf("EC_KEY_new err!\n");

        return -1;

        }

        key2=EC_KEY_new();

        if(key2==NULL)

        {

        printf("EC_KEY_new err!\n");

        return -1;

        }

        /* 获取实现的椭圆曲线个数 */

        crv_len = EC_get_builtin_curves(NULL, 0);

        curves = (EC_builtin_curve *)malloc(sizeof(EC_builtin_curve) * crv_len);

        /* 获取椭圆曲线列表 */

        EC_get_builtin_curves(curves, crv_len);

        /

*

        nid=curves[0].nid;会有错误,原因是密钥太短

        */

        /* 选取一种椭圆曲线 */

        nid=curves[].nid;

        /* 根据选择的椭圆曲线生成密钥参数group */

        group1=EC_GROUP_new_by_curve_name(nid);

        if(group1==NULL)

        {

        printf("EC_GROUP_new_by_curve_name err!\n");

        return -1;

        }

        group2=EC_GROUP_new_by_curve_name(nid);

        if(group1==NULL)

        {

        printf("EC_GROUP_new_by_curve_name err!\n");

        return -1;

        }

        /* 设置密钥参数 */

        ret=EC_KEY_set_group(key1,group1);

        if(ret!=1)

        {

        printf("EC_KEY_set_group err.\n");

        return -1;

        }

        ret=EC_KEY_set_group(key2,group2);

        if(ret!=1)

        {

        printf("EC_KEY_set_group err.\n");

        return -1;

        }

        /* 生成密钥 */

        ret=EC_KEY_generate_key(key1);

        if(ret!=1)

        {

        printf("EC_KEY_generate_key err.\n");

        return -1;

        }

        ret=EC_KEY_generate_key(key2);

        if(ret!=1)

        {

        printf("EC_KEY_generate_key err.\n");

        return -1;

        }

        /* 检查密钥 */

        ret=EC_KEY_check_key(key1);

        if(ret!=1)

        {

        printf("check key err.\n");

        return -1;

        }

        /* 获取密钥大小 */

        size=ECDSA_size(key1);

        printf("size %d \n",size);

        for(i=0;i<;i++)

        memset(&digest[i],i+1,1);

        signature=malloc(size);

        ERR_load_crypto_strings();

        berr=BIO_new(BIO_s_file());

        BIO_set_fp(berr,stdout,BIO_NOCLOSE);

        /* 签名数据,本例未做摘要,lol太极源码可将digest中的数据看作是sha1摘要结果 */

        ret=ECDSA_sign(0,digest,,signature,&sig_len,key1);

        if(ret!=1)

        {

        ERR_print_errors(berr);

        printf("sign err!\n");

        return -1;

        }

        /* 验证签名 */

        ret=ECDSA_verify(0,digest,,signature,sig_len,key1);

        if(ret!=1)

        {

        ERR_print_errors(berr);

        printf("ECDSA_verify err!\n");

        return -1;

        }

        /* 获取对方公钥,不能直接引用 */

        pubkey2 = EC_KEY_get0_public_key(key2);

        /* 生成一方的共享密钥 */

        len1=ECDH_compute_key(shareKey1, , pubkey2, key1, NULL);

        pubkey1 = EC_KEY_get0_public_key(key1);

        /* 生成另一方共享密钥 */

        len2=ECDH_compute_key(shareKey2, , pubkey1, key2, NULL);

        if(len1!=len2)

        {

        printf("err\n");

        }

        else

        {

        ret=memcmp(shareKey1,shareKey2,len1);

        if(ret==0)

        printf("生成共享密钥成功\n");

        else

        printf("生成共享密钥失败\n");

        }

        printf("test ok!\n");

        BIO_free(berr);

        EC_KEY_free(key1);

        EC_KEY_free(key2);

        free(signature);

        free(curves);

        return 0;

       }