Como descriptografar um carimbo de data / hora encapsulado?

0

Eu tenho um arquivo chamado signatures.xml que faz parte de um arquivo do Adobe AIR. Agora eu gostaria de descriptografar as informações armazenadas no registro de data e hora encapsulado XADES. Como posso obter informações da string criptografada? Quais ferramentas devem ser usadas? E eu preciso da chave pública para descriptografá-la e onde obtenho? (Como uma dica, acho que esse certificado foi usado: link ) E esse é o código:

 <xades:QualifyingProperties>
<xades:UnsignedProperties > 
  <xades:UnsignedSignatureProperties>
    <xades:SignatureTimeStamp>
      <xades:HashDataInfo uri="#PackageSignatureValue">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
        </Transforms>
        <xades:EncapsulatedTimeStamp>

    MIIIQgYJKoZIhvcNAQcCoIIIMzCCCC8CAQMxCzAJBgUrDgMCGgUAMIGvBgsqhkiG9w0BCRABBKCB
nwSBnDCBmQIBAQYCKQIwITAJBgUrDgMCGgUABBTRJGuAi64R/rtS0Vl/igSqQLG/3wIEEoJsshgP
MjAxMzA5MzAxMTMxMjRaMAMCATygUaRPME0xCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxHZW9UcnVz
dCBJbmMxJzAlBgNVBAMTHkdlb1RydXN0IFRpbWVzdGFtcGluZyBTaWduZXIgMaCCBY8wggLmMIIC
T6ADAgECAhBejS2spEZlVGu1h5eBkai/MA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJaQTEV
MBMGA1UECBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52aWxsZTEPMA0GA1UEChMGVGhh
d3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0GA1UEAxMWVGhhd3RlIFRpbWVz
dGFtcGluZyBDQTAeFw0wNzEwMzEwMDAwMDBaFw0xNzEwMzAyMzU5NTlaME0xCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxHZW9UcnVzdCBJbmMxJzAlBgNVBAMTHkdlb1RydXN0IFRpbWVzdGFtcGluZyBT
aWduZXIgMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr2cSRUIuWwkzzCmZ7JAkmml3LgpP
UWIwZGkule4Cdqm1sYykLX1Fw/kF5lbYnjQZGStQPfUnfa+RbQKnGNk+0SSYJWcApzfUouoWolC9
9TgXjwJJcZIfQnk8cmoKleXF+TkEQgiBTxKhDUa4KhayhbDvWh903qhKp0e6jo5T/pkCAwEAAaOB
hzCBhDAMBgNVHRMBAf8EAjAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly90c3MtZ2VvdHJ1c3Qt
Y3JsLnRoYXd0ZS5jb20vVGhhd3RlVGltZXN0YW1waW5nQ0EuY3JsMA4GA1UdDwEB/wQEAwIGwDAW
BgNVHSUBAf8EDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQUFAAOBgQCp8h1xrhHJJ0mPaN/n3gzf
qZ5J/SIs9aQD/tZsI6zzsvyS9uxqwrhS2IzRyvrrxQyYgdn2zlwzTn7W1I+yvJ2Bc+rwbOOpwW7X
9tlGoAdDnNn3YGHDL27aUD4WoCgM7OQBoeRsmdXCMah96y0TAilp2R6WF0D72u9i14QHsYL5kTCC
AqEwggIKoAMCAQICAQAwDQYJKoZIhvcNAQEEBQAwgYsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxX
ZXN0ZXJuIENhcGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQKEwZUaGF3dGUxHTAbBgNV
BAsTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1waW5nIENB
MB4XDTk3MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgYsxCzAJBgNVBAYTAlpBMRUwEwYDVQQI
EwxXZXN0ZXJuIENhcGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQKEwZUaGF3dGUxHTAb
BgNVBAsTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1waW5n
IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDWK1h4YUWGU+o0e1Gc7bDmLhgO/uBfqCfT
tMngfFlOFg5zVGDBf/afLuk6hSQVPNtHBGPDnsSUGlrfTHrz2UMdPBB6eSXbkP7wUecw1kEA/Z8o
33m+lLudthTjI4XXqUHgTKR5sCsai/L4O4o+RaxxkgC0kEGY+1/t+rcuiviINwIDAQABoxMwETAP
BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAGfb4sLmhz1Ag4Y3NX0fzprDDGYgqLqq
BImGwvUQCA2/y6IFitBNNj701+9pxl7ksJRvSrnn3luItnvb4yfldsPwNcHLtSebM3nckKYAnnf6
/M0nlEIWnNMcaOy/XN3lqXsQCjJ0VBMxi4UDhJG3WAEwFDivKMr8sVAZGQmsiUnTMYIB1jCCAdIC
AQEwgaAwgYsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxFDASBgNVBAcTC0R1
cmJhbnZpbGxlMQ8wDQYDVQQKEwZUaGF3dGUxHTAbBgNVBAsTFFRoYXd0ZSBDZXJ0aWZpY2F0aW9u
MR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1waW5nIENBAhBejS2spEZlVGu1h5eBkai/MAkGBSsO
AwIaBQCggYwwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0xMzA5
MzAxMTMxMjRaMCMGCSqGSIb3DQEJBDEWBBT3Vzs/HYAkfx+RMIi3fWS/+YzGWTArBgsqhkiG9w0B
CRACDDEcMBowGDAWBBQiPNonB5ZzgWtgihuMsKsCMBB/zDANBgkqhkiG9w0BAQEFAASBgJZOFu5t
PDnUenO2A1BZ788Yh/sRI/hjC//zAXRY9rnq/t7hvFGDbruA0pEsTlynJpaKeIu4J/M1iday+phr
BKcj7o0pFYKquDMC/RKnkG+P5tc9QBrvPaAwamrdjoYmXtC6hiRnkA/X0gG/68PtBjGJQpmPmcWt
CpdLjrFCsjen
            </xades:EncapsulatedTimeStamp>      
          </xades:HashDataInfo>         
        </xades:SignatureTimeStamp>
      </xades:UnsignedSignatureProperties> 
    </xades:UnsignedProperties>
  </xades:QualifyingProperties>
</Object>
    
por meles 28.12.2017 / 17:37

1 resposta

1

O XAdES é construído em torno de certificados X.509 e formatos relacionados, portanto, os "dados encapsulados" provavelmente contêm algum tipo de dados DER ASN.1, codificados em Base64. Mas é não necessariamente criptografado de qualquer forma - apenas uma camada espessa de formatos binários.

(Na verdade, o prefixo MII… é um sinal revelador de uma marca SEQUENCE ASN.1 escondida dentro de Base64.)

Eu não tenho a descrição do formato XAdES, mas depois de executar o valor da tag através de um decodificador Base64 e, em seguida, um dumper ASN.1 ( isto ou isto ou < um href="https://lapo.it/asn1js/"> isso ), eu recebo:

$ base64 --decode <data.txt >data.raw
$ dumpasn1 data.raw
   0 2114: SEQUENCE {
   4    9:   OBJECT IDENTIFIER signedData (1 2 840 113549 1 7 2)
  15 2099:   [0] {
  19 2095:     SEQUENCE {
  23    1:       INTEGER 3
  26   11:       SET {
  28    9:         SEQUENCE {
...

Convenientemente, o arquivo começa com seu próprio "tipo de conteúdo" (como tipos MIME, mas para X.500) e afirma ser uma estrutura PKCS # 7 (CMS) SignedData , essencialmente a mesma usada para S / MIME. O OpenSSL pode analisá-lo com sucesso:

$ openssl cms -in data.raw -inform DER -cmsout -print
CMS_ContentInfo: 
  contentType: pkcs7-signedData (1.2.840.113549.1.7.2)
  d.signedData: 
    version: 3
    digestAlgorithms:
        algorithm: sha1 (1.3.14.3.2.26)
        parameter: NULL
    encapContentInfo: 
      eContentType: id-smime-ct-TSTInfo (1.2.840.113549.1.9.16.1.4)
      eContent: 
        0000 - 30 81 99 02 01 01 06 02-29 02 30 21 30 09 06   0.......).0!0..
        000f - 05 2b 0e 03 02 1a 05 00-04 14 d1 24 6b 80 8b   .+.........$k..
        001e - ae 11 fe bb 52 d1 59 7f-8a 04 aa 40 b1 bf df   ....R.Y....@...
        002d - 02 04 12 82 6c b2 18 0f-32 30 31 33 30 39 33   ....l...2013093
        003c - 30 31 31 33 31 32 34 5a-30 03 02 01 3c a0 51   0113124Z0...<.Q
        004b - a4 4f 30 4d 31 0b 30 09-06 03 55 04 06 13 02   .O0M1.0...U....
        005a - 55 53 31 15 30 13 06 03-55 04 0a 13 0c 47 65   US1.0...U....Ge
        0069 - 6f 54 72 75 73 74 20 49-6e 63 31 27 30 25 06   oTrust Inc1'0%.
        0078 - 03 55 04 03 13 1e 47 65-6f 54 72 75 73 74 20   .U....GeoTrust 
        0087 - 54 69 6d 65 73 74 61 6d-70 69 6e 67 20 53 69   Timestamping Si
        0096 - 67 6e 65 72 20 31                              gner 1
    certificates:
      d.certificate: 
        cert_info: 
          version: 2
...

Aqui você pode ver os dados assinados encapsulados - que, novamente, são prefixados com um identificador de tipo e afirmam ser um "timestamp assinado" da RFC 3161. A seguir estão os certificados que foram usados para assinar a camada externa (não mostrada aqui por brevidade).

Se precisar apenas dos certificados, você pode usar:

$ openssl pkcs7 -in data.raw -inform DER -print_certs > signer.pem

Se você precisar dos dados assinados, existem várias maneiras de extraí-los. Claro que você pode copiar diretamente & cole os bytes necessários em um novo arquivo. Mas o método "adequado" seria fazer a verificação completa da assinatura e tudo mais:

$ wget -q https://www.thawte.com/roots/Thawte_Timestamping_CA.pem

$ openssl cms -in data.raw -inform DER \
              -verify -CAfile Thawte_Timestamping_CA.pem \
              -purpose any -attime $(date -d "1 year ago" +%s) \
              -out inner_data.raw -binary

O certificado de CA é apenas para verificação, mas openssl cms não tem a opção de ignorar as verificações de assinatura. -purpose é necessário porque o certificado de assinatura não era um certificado S / MIME. -attime é necessário porque o certificado já expirou.

Por fim, recebemos este RFC 3161 "TSTInfo" assinado no bloco de dados de data e hora. Infelizmente, ele parece estar malformado e o analisador ASN.1 do OpenSSL não o aceitará.

$ openssl ts -reply -in inner_data.raw -text
:error:0D0680A8:asn1 encoding routines:asn1_check_tlen:wrong tag:crypto/asn1/tasn_dec.c:1112:
:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:274:Type=TS_STATUS_INFO
:error:0D08303A:asn1 encoding routines:asn1_template_noexp_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:609:Field=status_info, Type=TS_RESP

Mas pelo menos seu conteúdo bruto pode ser descartado:

$ dumpasn1 inner_data.raw
  0 153: SEQUENCE {
  3   1:   INTEGER 1
  6   2:   OBJECT IDENTIFIER.
       :     Error: OBJECT IDENTIFIER has invalid length 2.
 10  33:   SEQUENCE {
 12   9:     SEQUENCE {
 14   5:       OBJECT IDENTIFIER sha1 (1 3 14 3 2 26)
 21   0:       NULL
       :       }
 23  20:     OCTET STRING D1 24 6B 80 8B AE 11 FE BB 52 D1 59 7F 8A 04 AA 40 B1 BF DF
       :     }
 45   4:   INTEGER 310537394
 51  15:   GeneralizedTime 30/09/2013 11:31:24 GMT
 68   3:   SEQUENCE {
 70   1:     INTEGER 60
       :     }
 73  81:   [0] {
 75  79:     [4] {
 77  77:       SEQUENCE {
 79  11:         SET {
 81   9:           SEQUENCE {
 83   3:             OBJECT IDENTIFIER countryName (2 5 4 6)
 88   2:             PrintableString 'US'
       :             }
       :           }
 92  21:         SET {
 94  19:           SEQUENCE {
 96   3:             OBJECT IDENTIFIER organizationName (2 5 4 10)
101  12:             PrintableString 'GeoTrust Inc'
       :             }
       :           }
115  39:         SET {
117  37:           SEQUENCE {
119   3:             OBJECT IDENTIFIER commonName (2 5 4 3)
124  30:             PrintableString 'GeoTrust Timestamping Signer 1'
       :             }
       :           }
       :         }
       :       }
       :     }
       :   }

Alternativamente:

$ openssl asn1parse -in inner_data.raw -inform DER -i
    
por 05.01.2018 / 13:31